블로그는 나의 힘!
[ Programing ]/Server2013. 9. 11. 14:51

ERROR_NETNAME_DELETED는 에러 번호로는 64번이고 한글로는 "지정된 네트워크 이름을 더 이상 사용할 수 없습니다." 정도로 해석됩니다. 구글에 ERROR_NETNAME_DELETED로 검색해보면 거의 IOCP와 관련된 글들이 나옵니다.

어떤 상황에서 이 에러를 만나게 되는지, 해결책은 무엇인지 적어봅니다.

 

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

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

 

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

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

 

ACE에서는 ACE_Asynch_Read_Stream.read() 나 ACE_Asynch_Write_Stream.write() 에서 0 이 아닌 다른 정수를 리턴하고(에러), ACE_OS::last_error() 하면 64번이 리턴됩니다.

ACE를 사용하지 않는 경우에는 Read/Write 혹은 GetQueuedCompletionStatus에서  에러가 발생하고 GetLastError하면 64번이 리턴되겠죠.

 

다른 분의 설명으로는 accept에서도 발생가능한데,

AccpEx호출 시 backlog에 있던 소켓이 accept가 되기 전에 접속을 끊어도 이 에러가 발생한다고 합니다. 

아마도 이 글이 그러한 상황인 것 같습니다.

 

 

 

요약하면

ERROR_NETNAME_DELETED가 발생하는 경우는 상대방이 HardClose한 상황 이므로 그냥 종료처리하면 된다 입니다.

 

 

 

 

출저 : valley.egloos.com

 

'[ Programing ] > Server' 카테고리의 다른 글

윈도우 소켓 WSAStartup, WSACleanup  (0) 2013.10.25
하나의 포트에 Connection은 몇 개까지 붙을 수 있는가.  (0) 2013.09.11
UDP 홀펀칭2  (0) 2013.08.22
UDP 홀펀칭  (0) 2013.08.22
IOCP  (0) 2013.08.22
Posted by Mister_Q