정리

GetQueuedCompletionStatus의 0 transferred bytes (4)

저장소/VC++

경험 부족이네, 확신이 없어 여기저기 퍼온다. ㅋ

긁어다 붙였는데 잘 붙네.. 원치 않는 것 까지.. ㅡㅜ


원문 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=722711&ref=722690



 iocp 서버만들때 클라이언트가 연결을 끊었을경우  | VC++ 일반2008-05-18 오후 10:16:41
정종현 (jjjjrr)  정종현님께 메시지 보내기정종현님을 내 주소록에 추가합니다.정종현님의 개인게시판 가기번호: 722690  / 읽음:143

안녕하세요

iocp 서버만들때

클라이언트가 연결을 끊었을경우

어떤이벤트가 발생하는지...

아래코드에서보면

if(dwBytesTrans == 0)   // 전송받은 것이 없다면 클라이언트가 종료한 경우
이경우가 클라이언트가 종료시의경우인데

bRet 가 false 이고

   ErrorCode = GetLastError();
   if (ERROR_NETNAME_DELETED == ErrorCode) 

인경우도 클라이언트의 연결이 끊어진경우라고하던데

이두경우의 차이점이 뭔가여?

 

 

  bRet = GetQueuedCompletionStatus(pIOCP->m_hIOCP, &dwBytesTrans, reinterpret_cast<ULONG_PTR*>(&pClient),
   reinterpret_cast<LPOVERLAPPED*>(&pIO), INFINITE);
  if(bRet)   // 에러상태를 점금한다
  {
   if((ULONG_PTR)pClient == THREAD_DIE)  // 스레드 강제종료
   {
          int ErrCode = WSAGetLastError();
    TRACE("IOCP 스레드 강제종료: %d\n", ErrCode);
       //pIOCP->CloseClient(pClient, FALSE);
    return FALSE;
   }
  }
  else
  {
   ErrorCode = GetLastError();
   if (ERROR_NETNAME_DELETED == ErrorCode) 

   {
   }
   continue;
  }

  if(dwBytesTrans == 0)   // 전송받은 것이 없다면 클라이언트가 종료한 경우
  {
   continue;
  }

이 글에 답변 등록하기
 [답변].2008-05-19 오전 12:02:01
박인규 (linuxian)  박인규님께 메시지 보내기박인규님을 내 주소록에 추가합니다.박인규님의 개인게시판 가기번호: 722698  

ERROR_NETNAME_DELETED은 IO작업중인 상태에서 접속이 끊긴 것입니다.

비정상적 종료라고 보시면 되겠구요.

 

recv 했을 때 버퍼의 크기가 0이라면 정상적인 종료로 보시면 됩니다.

 

이 글에 답변 등록하기
         [답변]클라이언트의 연결이 끊어진경우가2008-05-19 오전 7:22:09
정종현 (jjjjrr)  정종현님께 메시지 보내기정종현님을 내 주소록에 추가합니다.정종현님의 개인게시판 가기번호: 722710  

답변감사합니다

혹시 이두경우외에 클라이언트의 연결이 끊어진경우가

있을까여?

ERROR_NETNAME_DELETED 상태를 몰라서 한참헤멨는데

다른경우는 없을런지...

 

이 글에 답변 등록하기
 [답변].2008-05-19 오전 7:39:20
박인규 (linuxian)  박인규님께 메시지 보내기박인규님을 내 주소록에 추가합니다.박인규님의 개인게시판 가기번호: 722711  

GetQueuedCompletionStatus 이 함수가 거짓을 리턴되었다는 것은 요청한 IO 작업을 완료하지 못했다는 뜻입니다.

즉 IO 작업중에 또는 작업시도할때 상대편에 무슨 일이 생긴 것이지요.

왜냐하면 TCP는 기본적으로 연결을 보장하니까요.

이때 에러코드가 ERROR_NETNAME_DELETED 입니다. 솔직히 이건 문서에도 잘 나와있지 않은거라

저도 경험상 찾아낸 기억이 나네요.

 

 

GetQueuedCompletionStatus 은 TRUE를 리턴하면 IO작업을 완료했다는 뜻입니다.

Iocp에서 WSARecv를 걸어 두죠?

따라서 Recv에서 0바이트를 리턴(IO 완료)했다는 의미는 접속이 끊어진 걸로 간주하는 겁니다.

이것은 왜 그렇게 했느냐.. ㅎㅎ 처음 만든 사람이 그렇게 한거죠. 전송받은 바이트는 항상 0보다 클테니

0을 리턴하면 접속 종료로 하자 머 이런..