소켓 API는 생성, 수신, 통신, 종료 상태를 나누어 본다
소켓 오류는 함수 이름만 외우면 놓치기 쉽습니다. listening socket과 connected socket을 분리하고, `send()`/`recv()` 반환값이 상태 신호라는 점을 함께 봐야 합니다.
create
socket → bind
파일 디스크립터를 만들고 로컬 주소와 포트를 정합니다.
listen
listen → accept
listening socket은 계속 대기하고, accept는 새 connected socket을 돌려줍니다.
transfer
send ↔ recv
TCP는 메시지가 아니라 바이트 스트림이므로 프레이밍 규칙이 필요합니다.
close
shutdown / close
FIN, RST, half-close, broken pipe를 종료 신호로 구분합니다.
상황
반환/증상
의미
처리
accept
새 fd 반환
클라이언트별 connected socket
원래 server fd는 닫지 않음
recv
0 반환
상대가 정상 종료 FIN 전송
남은 데이터 처리 후 close
send
부분 전송
버퍼 일부만 커널에 복사됨
반복 전송 또는 sendall 사용
write
Broken pipe
이미 닫힌 연결에 쓰기
SIGPIPE/오류 처리, 상태 확인
backlog 동시 접속자 수가 아니라 accept 대기 큐다 완료된 연결이 애플리케이션에 수락되기 전 쌓이는 큐로 이해합니다.
framing TCP에는 메시지 경계가 없다 길이 prefix, 구분자, 고정 길이 같은 애플리케이션 규칙이 필요합니다.
retry EINTR과 EAGAIN은 실패 의미가 다르다 블로킹/논블로킹 모드에 따라 재시도 조건을 분리해야 합니다.