WSACancelBlockingCall 호출로 인해 차단 작업이 중단되었다는 오류 메세지에 대해 알아보려고 합니다. 어떤 상황에서 발생하는지 확인해 보도록 하겠습니다.
WSACancelBlockingCall 실제 오류 메세지
WSACancelBlockingCall를 호출하여 차단 작업이 중단되었습니다
System.Net.Sockets.SocketException (0x80004005): WSACancelBlockingCall를 호출하여 차단 작업이 중단되었습니다
위치: System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
위 로그를 보면 WSACancelBlockingCall 오류가 발생했을 때, StackTrace 위치를 살펴보면 Socket.Receive 함수에서 오류가 발생한것을 알수 있습니다. 즉, 소켓 데이터를 수신하려다 발생되는 메세지입니다.
윈도우 소켓 에러코드 정의를 살펴보면 다음과 같이 10004로 정의가 되어 있습니다.
에러코드 | 에러코드 명칭 | 에러코드 설명 |
---|---|---|
10004 | WSAEINTR | 함수 호출이 중단되었습니다. WSACancelBlockingCall 호출로 인해 차단 작업이 중단되었습니다. |
함수 호출이 중단되었습니다의 뜻은 소켓클래스의 Receive 함수 호출이 중단되었다는 뜻이고, 소켓이 연결이 되어 있지 않은 상태이기때문에 소켓 데이터 수신 함수인 Receive 함수가 호출될 수 없다는 뜻입니다.
소켓이 연결되어 있는 상태에서 Recieve 함수가 동작할수 있지만, 이미 연결이 끊겨있는 상태에서 Recieve 함수를 호출 했기 때문입니다.
소켓 연결이 실제로는 끊겼으나, 어떤 이유로 Socket.Connected 상태 플래그가 변경되지 않았을 경우에도 발생할 수 있습니다.
c# 프로그래밍의 예를 들면, 다른언어로 개발된 서버에서 강제로 소켓을 종료했을 때 소켓이 끊어졌다는 이벤트를 받지 못할때가 있습니다. 반대의 경우도 있을 수 있습니다.
소켓이라는 것이 송신, 수신을 담당하기 때문에 둘중 하나만 끊어지는 경우 이런문제가 발생할 수 있고, C#의 경우 이런 문제를 방지하기 위하여 아래와같은 코드를 이용하기도 합니다.
Socket.Shutdown(SocketShutdown.Both);
SocketShutdown.Both 상수를 이용해 소켓종료시 송신,수신 모두 완료된 후에 소켓연결을 끊기때문에 확실하게 연결이 끊어집니다.
윈도우 소켓 에러 코드 정리를 참고하세요.