Socket Debugging

소켓 오류는 대개 상태와 버퍼를 잘못 읽어서 생긴다

기본 API의 이름은 짧지만, 실제 장애는 포트 점유, 연결 상태, 부분 전송, 바이트 스트림 오해에서 자주 나온다.

Address already in use는 포트 점유와 TIME_WAIT 상황을 함께 본다.
Connection refused는 상대 포트에 listening socket이 없다는 신호다.
Broken pipe와 partial send는 쓰기 전에 연결 상태를 확인해야 한다.
EADDRINUSE Address already in use

같은 주소/포트에 이미 listener가 있거나, 종료 직후 재사용 규칙에 걸릴 수 있다.

ECONNREFUSED Connection refused

상대 IP는 닿았지만 해당 포트에서 연결을 받아 줄 프로세스가 없다.

recv == 0 Peer closed

빈 바이트는 “아직 데이터 없음”이 아니라 상대가 연결을 닫았다는 뜻이다.

short write partial send

send가 요청한 바이트를 모두 보낸다는 보장은 없다. 반환값을 확인한다.

SIGPIPE Broken pipe

이미 닫힌 연결에 쓰면 오류가 난다. 읽기 루프와 예외 처리가 필요하다.

stream message split

TCP는 메시지 단위가 아니라 바이트 단위다. 프레이밍을 직접 설계한다.

1 상태 확인

서버가 listen 중인지, 포트와 주소가 맞는지 먼저 확인한다.

2 반환값 확인

recv, send, accept, connect는 성공/실패와 실제 바이트 수를 돌려준다.

3 프로토콜 규칙 추가

길이, 종료 조건, timeout, 재시도 정책을 애플리케이션이 정한다.

실무 감각 소켓 API는 “연결된 것처럼 보이는 fd”를 줄 뿐이다. 견고한 프로그램은 fd의 상태, 버퍼의 일부 처리, 상대방 종료, OS별 옵션 차이를 모두 코드로 다룬다.