socket lifecycle

소켓 수명 주기는 연결보다 종료와 오류 처리가 어렵다

서버가 bind와 listen에 성공해도 accept, recv, send, close 단계마다 다른 실패 조건을 처리해야 합니다.

bind/listen

주소 재사용, 포트 충돌, backlog 크기와 방화벽 허용을 확인합니다.

accept

클라이언트 연결을 새 소켓으로 분리하고 원격 주소를 기록합니다.

recv

0바이트는 정상 종료, timeout과 ECONNRESET은 다른 처리 경로가 필요합니다.

send

send가 일부만 보낼 수 있으므로 sendall이나 반복 전송으로 보장합니다.

프레이밍

TCP는 바이트 스트림이므로 메시지 경계는 길이 prefix나 delimiter로 직접 정합니다.

오류 처리

Broken pipe는 이미 닫힌 연결에 쓰는 상황을 뜻합니다.

연결 상태 변화

연결 수립, 데이터 교환, 종료 신호를 코드 경로로 나눕니다.