정리

GetQueuedCompletionStatus의 0 transferred bytes (2)

저장소/VC++

음.. 


원문 출처 : http://copynull.blog.me/10078931630


네트워크 접속이 비정상으로 끊겼을 때는 
GetQueuedCompletionStatus()함수가 FALSE를 리턴하고 수신바이트 크기가 0(zero) 입니다. 

정상적으로 끊겼을 때는 
GetQueuedCompletionStatus()함수가 TRUE를 리턴하고 수신바이트 크기가 0(zero) 입니다. 
이 때 GetQueuedCompletionStatus()에서 Overlapped Recv I/O 가 리턴됩니다. 

 

비정상적종료 :   리턴값 false, 수신바이트 0

정상적인종료 :   리턴값 true,  수신바이트 0

 

즉 간단히 코드로 설명해보면

 

BOOL result = GetQueuedCompletionStatus(......);

 

if( result == FALSE || recvBytes == 0 )

{

        if( result == FALSE )

        {      비정상 종료 알려주는 코드  WSAGetLastError()로 알림   }

      // 정상 종료 코드

      // 종료를 진행한다....

}

 

IO_TYPE로 검사후 진행되는 코드의 경우 아래와 같이 진행하면 되겠다.

if ( !result || ( result && !recvBytes ) )
  {
   if (OverlappedEx->IoType == IO_ACCEPT)    // 데이터가 없어도 IO_ACCEPT라면 접속함수로 넘김
    OnIoConnected(Object);
   else                                                    // 그것도 아니면 완전 모두 에러처리
    OnIoDisconnected(Object);

   continue;
  }