서버나 클라이언트를 종료하고 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) 정승유님의 글
