정리

네트워크 프로그래밍 할 때 종종 보는 에러들 정리

저장소/VC++

IOCP를 사용한 네트워크 프로그래밍에서 종종 보이는 에러들, 자주 보이는 순서대로 정리.

수신 대기 중 발생되는 에러 원인 찾다가 잘 정리된 내용 복사복사.


내용 출처 :

네이버, 구글 검색

내가 테스트 해본 것도 포함

http://javawork.egloos.com/2265358

http://cafe.naver.com/ongameserver/3758

http://newworlds.tistory.com/1178

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=345120&ref=336795

http://blog.naver.com/ddinggill/100110486640


http://coderoid.tistory.com/46

http://www.gpgstudy.com/forum/viewtopic.php?p=41368

http://mindsteeper.tistory.com/188




ERROR_SEM_TIMEOUT (121)

The semaphore timeout period has expired.

장비(방화벽 또는 라우터) 이상 또는 제한으로 인한 네트워크 단절(랜선을 뽑는 경우도 포함)이 발생했을 때

(어느쪽? 서버? 클라?)


ERROR_NETNAME_DELETED (64)

The specified network name is no longer available.

보통 IOCP에서 소켓 끊어짐의 상징은 0 byte read 입니다.

0 byte read가 통보되는 시점은 상대방 소켓에서 closesocket() 혹은 shutdown() 함수를 호출한 시점입니다.

즉, 상대방이 closesocket() 혹은 shutdown() 을 호출하지 않고 종료해버리면 일반적으로 0 byte read는 발생하지 않습니다.

이렇게 0 byte read가 발생하지 않은 상태에서 read() 혹은 write()를 시도하면 상대는 이미 종료 되었으므로

ERROR_NETNAME_DELETED 에러가 나게 됩니다. 이러한 경우를 우아한 종료와는 반대되는 개념으로 HardClose라고 합니다.


WSAENOTSOCK (10054)

An operation was attempted on something that is not a socket.

지정한 소켓은 정상 적이지 않습니다(INVALID_SOCKET). 별도의 종료처리없이 소켓을 닫으면 나옵니다. 


ERROR_IO_PENDING (997)

Overlapped I/O operation is in progress.

이건 더 수신(송신)할 내용이 있을 때 확인되는 값으로 에러로 보기 어렵다.

수신중이었다면 마저 수신처리 하면 된다.

데이터 수신량 확인 시 0 byte면 종료로 봐야하나.

아닌가? 모르겠다. 이건 볼 때마다 모르겠다. 뭐야 이거;; 무서워

허나 GetQueuedCompletionStatus 호출 후 결과는 성공인데 transferred bytes가 0 일 경우에도 이 에러가 확인 된다.

임의로 0 byte를 보내지 않는 이상 보편적으로 transferred bytes가 0 이면 연결이 끊긴 것으로 간주한다.

이럴 땐 transferred bytes의 값을 보고 판단하는게 맞는 것 같다.


ERROR_OPERATION_ABORTED (995)

The I/O operation has been aborted because of either a thread exit or an application request.

1. 작업이 취소된 사례. CreateIoCompletionPort에 추가한 핸들(소켓)이 닫혔을 때.

 클라이언트가 연결된 상태에서 서버가 먼저 종료하면 발생.(server socket이 close되어서)

2. 동시에 송수신할 때

 CreateIoCompletionPort에 핸들(소켓)을 추가하기 전에

 WSADuplicateSocket 이나 DuplicateHandle 를 이용해 핸들을 복사하여 분리해서 추가해주면 된다고 한다.(정말?? 진짜??)