더북(TheBook)

소켓의 종류에 상관없이 소켓을 닫으려면 closesocket() 함수를 호출한다.

int closesocket(SOCKET sock);

TCP 소켓을 해제할 땐 나가고 들어오는 잔여 데이터 전부가 전송이 완료되고 확인응답까지 마친 상태에서 끝내도록 하는 것이 중요하다. 먼저 소켓 밖으로 나가는 데이터 전송을 중단한 후, 이미 나간 데이터의 확인응답을 모두 받고, 들어오는 데이터를 모두 읽어 들일 때까지 기다린 후에 비로소 소켓을 닫도록 하면 최선이다.

소켓을 닫기 전에 전송과 수신을 중단하려면 shutdown() 함수를 호출한다. 

int shutdown(SOCKET sock, int how);

how 파라미터로 SD_SEND를 넘겨 전송을 중단하며, SD_RECEIVE로 수신을 중단한다. 혹은 SD_BOTH를 써서 송수신을 모두 중단할 수 있다. SD_SEND를 지정하면 현재 전송 중인 데이터를 모두 전송한 뒤 FIN 패킷을 보내도록 하는데, 이로써 상대방에게 이제 연결을 안전하게 닫고자 한다는 걸 알려준다. 그러면 상대방도 FIN 패킷을 응답하게 될 것이다. 이렇게 FIN 패킷을 주고받고 나면 소켓을 실제로 닫아도 안전하다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.