WSACleanup

WSACleanup 함수는 WS2_32.DLL의 사용을 종료하는 함수입니다.

int WSACleanup (void);

 

Remarks

이 함수가 사용되기 전에 WSAStartup함수의 성공적이 수행이 있어야 합니다. 이 함수는 WSAStartup함수로 윈속을 초기화 하고 윈도즈 소켓을 다 사용하고 나서 사용한 소켓 리소스를 반환할 때 사용되는 함수이므로 반드시 윈도즈 소켓 사용후에 더 이상 소켓 자원이 필요 없을 때, 꼭 호출되어야 합니다. 또한 이함수가 수행될 때, 블록킹 상태에 있는 처리나, 비동기 작업은 통지 메시지나 이벤트의 포스팅 작업이 없이 바로 취소됩니다. 결국 완벽한 작업을 끝마치지 못한 상태에서 중지되는 것이라 하겠죠. 이러한 경우 연산은 실패로 돌아가고, WSA_OPERATION_ABORTED라는 에러코드를 발생하게 됩니다.

WSACleanup함수가 호출되었을 때 개방된 소켓은 리셋되고 WSACleanup함수가 호출되기 전에 closesocket 함수에 의해 닫힌 소켓은 정상적으로 닫히게 됩니다. 이 때 소켓은 전송 큐에 걸려 있는 데이터를 여전히 가지게 됩니다. WSACleanup 함수가 호출되지 않을 경우 걸려있는 데이터는 그대로 전송되게 됩니다.

참고의 말씀을 드리자면, 이렇게 걸려있는 데이터(pending data)를 다 전송하도록 하려면, 접속을 종료하기 위해 shutdown 함수를 호출해야 합니다. 이렇게 하면 걸려있는 데이터를 모두다 전송 할 때까지 대기하게 되고, 그다음에 closesocket 그리고, WSACleanup 함수를 호출하게 된다면, 아주 이상적으로 소켓을 종료 할 수 있습니다.

블록킹 후크 상태에서 WSACleanup 함수를 호출하려면, 먼저 WSACancelBlockingCall 함수를 먼저 호출하고 나서 WSACleanup 함수를 호출해야만 한다는 점 주의하시구요. 음... 또 주의 해야 할점은 멀티 쓰레드 환경에서, WSACleanup 함수의 호출은 모든 쓰레드에 대해서 윈속 연산을 종료시킨 다는 것입니다. 넘 당연한 야글 했나요?

 

Return Values

성공할 경우 0을 반환하고, 에러가 발생할 경우 SOCKET_ERROR 에러가 반환되고, WSAGetLastError 함수를 호출해서 특정한 에러코드를 얻어낼 수 있습니다.

 

Error Codes

WSANOTINITIALISED

이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.

WSAENETDOWN

네트웍 서브 시스템에서 에러가 났습니다.

WSAEINPROGRESS

블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.

 

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE :
버젼 1.0 그리고 그이후의 버젼에서 사용가능
Header :
          Win16/32 : winsock.h
          Win32-II : winsock2.h
Import Library :
          Win16 : winsock.lib
          Win32 : wsock32.lib
          Win32-II : ws2_32.lib

See Also

overview, closesocket, shutdown, WSAStartup