네트워크 프로그래밍 할 때 종종 보는 에러들 정리
저장소/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 를 이용해 핸들을 복사하여 분리해서 추가해주면 된다고 한다.(정말?? 진짜??)
'저장소 > VC++' 카테고리의 다른 글
Command Line Build : VCBuild와 MSBuild 그리고 devenv (0) | 2013.04.16 |
---|---|
Visual Studio 원격 디버깅(Remote Debugger) (0) | 2013.03.28 |
TortoiseSVN(Diff, Log, Blame)과 Visual Studio 통합 방법 (0) | 2013.03.19 |
Verifying the Signature of a PE File : 코드사인 검증 (0) | 2013.03.14 |
gtest VS2012에서 에러 - error C2977: 'std::tuple' : too many template arguments (0) | 2013.03.08 |