[1] 장비 TCP에서 가장 많이 보는 소켓 에러 4종 완전 정리 (10053 / 10054 / 10060 / 10061)
장비 프로그램을 개발하다 보면 TCP 통신이 잘 되다가 갑자기 끊기는 현상을 자주 보게 됩니다.
그리고 로그에는 이런 에러가 찍혀 있습니다.
10053 ConnectionAbortedLocal
10054 ConnectionResetByPeer
10060 ConnectionTimedOut
10061 ConnectionRefused
이 에러들의 진짜 의미를 이해하면, 네트워크를 의심할 필요도 없고,
코드를 의심할 필요도 없고,
어디를 확인해야 하는지 바로 알 수 있습니다.
🔥 소켓 에러 실전 판단표 (장비 TCP 기준)
| 코드 | 이름 | 누가 끊었나 | 발생 시점 | 진짜 원인 | 바로 확인할 것 |
|---|---|---|---|---|---|
| 10053 | ConnectionAbortedLocal | 내 PC(OS) | 통신 중 / Idle 후 | NIC 절전, PCIe 절전, 드라이버, Idle 세션 정리 | 전원 옵션, KeepAlive, 랜카드 고급옵션 |
| 10054 | ConnectionResetByPeer (RST) | 상대편 | 통신 중 갑자기 | 프로그램 종료, 전원 OFF, 케이블 분리 | 상대 장비 전원/로그 확인 |
| 10060 | ConnectionTimedOut | 아무도 응답 없음 | Send 후 대기 | 상대 멈춤, 네트워크 지연/유실 | 상대 동작 여부, 네트워크 품질 |
| 10061 | ConnectionRefused | 상대가 거절 | Connect 시도 순간 | 서버 프로그램 미실행, 포트 미오픈 | 서버 실행 여부, 포트 확인 |
💥 10053이 가장 헷갈리는 이유
PC는 멀쩡히 켜져 있고, 화면도 켜져 있고, 프로그램도 잘 돌고 있는데
TCP만 끊어집니다.
이유는 PC 절전이 아니라,
랜카드(NIC)만 몰래 절전에 들어가기 때문입니다.
사람 입력 없음
→ Windows: 한가하네?
→ PCIe 링크 절전
→ 랜카드 저전력 모드
→ TCP 세션 사망
→ 10053 발생
✅ 반드시 꺼야 하는 윈도우 설정
제어판 → 전원 옵션 → 고급 전원 설정
- PCI Express → 링크 상태 전원 관리 → 끔
- 절전 모드 → 사용 안 함
- 네트워크 어댑터 설정 → 최대 성능
✅ KeepAlive를 반드시 써야 하는 이유
TCP는 서로 아무 데이터도 안 보내면
살아있는지 죽었는지 모릅니다.
그래서 스위치/방화벽/OS가
Idle 세션을 죽여버립니다 → 10053
KeepAlive는 OS에게 이렇게 말해줍니다.
"이 세션 살아있어. 죽이지 마."
C# KeepAlive 설정 코드
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
byte[] inOptionValues = new byte[12];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)10000).CopyTo(inOptionValues, 4);
BitConverter.GetBytes((uint)3000).CopyTo(inOptionValues, 8);
socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
중요: Client / Server 양쪽 다 설정해야 의미가 있습니다.
🎯 실무에서 쓰는 판단 공식
10053 → 우리 PC 전원/NIC/KeepAlive
10054 → 상대 장비 문제
10060 → 상대 멈춤 또는 네트워크 품질
10061 → 서버 안 떠 있음
마무리
TCP 끊김의 80%는 코드 문제가 아니라
윈도우 전원 관리 + KeepAlive 미설정 때문입니다.
이 설정만 제대로 해도,
밤에 TCP 끊겨서 아침에 난리나는 일은 거의 사라집니다.
'개발 & 기술 > C# Debug & 장애 분석' 카테고리의 다른 글
| [3편] Send가 막히면 왜 TCP 연결이 끊어질까? (0) | 2026.01.27 |
|---|---|
| [2편] 왜 Receive 스레드가 막히면 TCP 연결이 끊어질까? (1) | 2026.01.27 |
| C# WinForms 예외 처리 템플릿 | CrashLog Starter Kit (로그 + 종료 정책 제어) (1) | 2025.08.25 |