getqueuedCompletionStatus REFERE REMORT SOCKET CLOURE에서 ERROR_NETNAME_DELETED를 반환합니다

StackOverflow https://stackoverflow.com/questions/5475171

문제

I / O 완료 포트를 사용하여 작은 서버 클라이언트 재료를 작성하고 있습니다.

서버와 클라이언트가 내 완료 포트 위에 수락을 통해 성공적으로 연결되어 있습니다. 클라이언트가 연결된 후 클라이언트 소켓이 완료 포트와 연관되고 해당 소켓의 WSARECV에 대한 겹쳐진 호출이 호출됩니다.

클라이언트 테스트 프로그램을 닫을 때까지 모든 것이 잘 작동합니다. GetQueuedCompletionStatus()FALSE를 반환하고 GetLastError를 반환합니다

error_netname_deleted

, 그것은 나에게 의미가있는 (MSDN에 대한 설명을 읽은 후)

그러나 내 문제는 GetQueuedCompletionStatus가 apprent return 값을 반환하기 때문에 WSARecv가 소켓 닫기로 인한 실패를 나타내는 패킷을 반환하는 것으로 생각된다고 생각했습니다. 이것은 어떤 클라이언트 소켓이 어떤 클라이언트 소켓이 오류를 일으켰는지 알지 못하고 (자유 구조물,이 특정 연결을위한 정리 등 정리)

이를 해결하는 방법에 대한 제안이나 힌트?

감사합니다 :)

편집 : http://codepad.org/weyinaso <- 책임자 ... "오류 "while-loop의 첫 번째 함수의 발생 (getqueuedCompletionStatus ()의 래퍼 일어난 GetCompletionStatus()의 호출은 다른 경우 잘 작동합니다) [그곳에 게시했으나, 여기에서 엿 같은 & 지저분 해 보이기 때문에]

도움이 되었습니까?

해결책

GetQueuedCompletionStatus를 호출 할 때 관심을 갖는 시나리오는 다음과 같습니다.

  • GetQueuedCompletionStatusTRUE를 반환합니다. 성공적인 완료 패킷이 수신되었으며 모든 아웃 된 매개 변수가 채워졌습니다.
  • GetQueuedCompletionStatusFALSE를 반환합니다. lpOverlapped == NULL : 패킷이 삭제되지 않았습니다.다른 출력 매개 변수에는 불확실성 값이 포함됩니다.
  • GetQueuedCompletionStatus FALSE, lpOverlapped != NULL : 이 함수는 실패한 완료 패킷을 뺀 값입니다.오류 코드는 GetLastError를 통해 사용할 수 있습니다.

    GetQueuedCompletionStatusFALSElpOverlapped != NULL를 반환하면 I / O 완료가 실패했습니다.그것은 당신이 걱정해야 할 lpOverlapped의 가치입니다.

다른 팁

이것은 오래된 질문이지만, ERROR_NETNAME_DELETED에 대한 자세한 내용은이 페이지를 찾았습니다.겹쳐진 Readfile()를하는 동안 얻는 오류입니다.

일부 디버깅 후에는 소켓에 쓰는 프로그램에 의해 문제가 발생했지만 closesocket() (가비지 수집 문제로 인해)를 사용하기 전에 ExitProcess()를 호출하는 것을 잊어 버렸습니다.Calling CloseHandle()는 오류를 방지하지 않으며 WSACleanup() 전에 ExitProcess()를 추가하지 않았습니다.그러나 클라이언트가 종료되기 전에 짧은 수면을 추가하여 오류가 발생하지 않았습니다.어쩌면 ExitProcess()를 피하는 것이 문제를 방지 할 수 있습니다.

소켓을 올바르게 닫히지 않고 나가지 않고 문제가 발생하면 문제가 발생합니다.

소켓이 일반적인 파일 설명자가있는 유닉스에서 문제가 될 것이라고 생각하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top