Quick Flow
server: socket -> bind -> listen -> accept -> send/recv -> shutdown -> close
client: socket -> connect -------> send/recv -> shutdown -> closeListen socket은 새 연결 요청을 받는 endpoint이고 accept가 반환한 connected socket은 client 한 연결과 통신합니다. 둘의 수명과 오류 처리를 분리합니다.
Server 경계
bind는 local address와 port를 socket에 연결하고 listen은 연결 요청을 받을 상태로 전환합니다. accept는 새로운 connected socket을 반환하며 listen socket은 다음 연결을 계속 받을 수 있습니다.
한 번의 send나 recv가 요청한 전체 byte를 처리한다고 보장되지 않을 수 있습니다. 반환된 byte 수를 기준으로 남은 범위를 반복 처리하고, recv가 0을 반환하는 정상 종료와 오류 코드를 구분합니다.
종료와 정리
shutdown은 송수신 방향의 protocol 종료를 시작하고 close는 local socket resource를 해제합니다. Close만 호출해도 OS가 정리하지만 pending data, graceful close, timeout 요구가 있으면 종료 순서를 명시합니다.
Connection마다 buffer, parser, authentication, timeout 상태를 독립적으로 관리합니다. Socket handle 숫자를 영구 사용자 ID로 사용하지 않습니다.
자주 틀리는 점
accept가 listen socket 자체를 client socket으로 바꾼다고 생각하지 않습니다.- TCP에서 receive 경계와 application message 경계를 같게 보지 않습니다.
- Socket close 뒤 pending callback이 접근할 수 있는 상태 수명을 함께 정리합니다.
- IPv4만 가정하지 말고 address family와 name resolution 결과를 순회합니다.
참고 링크
2 sources