소켓을 우아하게 종료하기

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

오렌지맵 예전의 2차배포자료

1) 공간격자(Spatial Grid) 적용
2) 수치지도의 도형 및 속성 편집 및 Undo, Redo 기능
3) Legend 컨트롤(레이어 관리 컨트롤) 추가
4) 좌표, 거리, 면적측정 기능
5) ESRI의 Shape의 가져오기
6) 그림 파일 및 높은 품질의 EMF 내보내기 기능
7) 개발자 지원 강화

다운로드