← 질문 목록
#349깊이 0
소켓 close()와 shutdown()의 차이는 무엇인가?
네트워크
close()는 소켓 소유권을 포기하고 읽기와 쓰기를 모두 닫는 반면, shutdown()은 파일 디스크립터를 유지한 채 송수신 방향을 선택해서 닫기 때문이다.
| 기준 | close() | shutdown() |
|---|---|---|
| FD 반납 | 즉시 반납한다 | 유지한다 |
| 방향 제어 | 읽기와 쓰기를 모두 닫는다 | SHUT_RD, WR, RDWR 선택 |
| 참조 카운트 | 카운트가 0일 때만 FIN 전송 | 카운트와 무관하게 FIN 전송 |
close()는 프로세스가 해당 파일 디스크립터를 완전히 내려놓는다. 이때 참조 카운트가 0이 되어야 비로소 상대에게 FIN 패킷을 보낸다.
shutdown()은 참조 카운트와 상관없이 지정한 방향의 연결을 즉시 끊는다. 쓰기만 닫아 상대에게 FIN을 보내고 읽기는 유지하는 Half-close를 구현할 때 쓴다.
fork()로 디스크립터를 공유하는 환경에서 close()를 부르면 다른 프로세스가 소켓을 쥐고 있어 연결이 안 끊길 수 있다. 이때 확실히 FIN을 보내려면 shutdown()을 쓴다.