개발 & 기술/C# Debug & 장애 분석

[1] 장비 TCP에서 가장 많이 보는 소켓 에러 4종 완전 정리 (10053 / 10054 / 10060 / 10061)

runtime-income 2026. 1. 27. 10:44

[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 끊겨서 아침에 난리나는 일은 거의 사라집니다.