서버나 클라이언트를 종료하고 netstat로 종료시에 소켓이 어떤 상태인지 살펴보면 ‘TIME_WAIT’으로 표시되어있는것을 볼수있습니다. 그리고 그것들은 잠시(몇분)후에 사라졌습니다. 소켓을 종료할때 이러한 ‘TIME_WAIT’ 과정을 거치지 않고 우아하게 바로 종료하는 방법은 아래와 같습니다.
code = ::shutdown( m_hSocket, SD_BOTH ); // Send a FIN here // Wait for socket to fail (ie closed by other end) if( code != SOCKET_ERROR ) { fd_set readfds; fd_set errorfds; timeval timeout; FD_ZERO( &readfds ); FD_ZERO( &errorfds ); FD_SET( m_hSocket, &readfds ); FD_SET( m_hSocket, &errorfds ); timeout.tv_sec = MAX_LINGER_SECONDS; timeout.tv_usec = 0; ::select( 1, &readfds, NULL, &errorfds, &timeout ); } code = ::closesocket( m_hSocket ); m_hSocket = INVALID_SOCKET;
이것이 ACK과 FIN을 기다는 방법입니다. 이렇게 하지 않았을때는 소켓은 오랜시간동안 TIME_WAIT의 대기과정을 거쳐야합니다.
[출처] 델마당(www.delmadang.com) 정승유님의 글