getqueuedCompletionStatus REFERE REMORT SOCKET CLOURE에서 ERROR_NETNAME_DELETED를 반환합니다
-
14-11-2019 - |
문제
I / O 완료 포트를 사용하여 작은 서버 클라이언트 재료를 작성하고 있습니다.
서버와 클라이언트가 내 완료 포트 위에 수락을 통해 성공적으로 연결되어 있습니다. 클라이언트가 연결된 후 클라이언트 소켓이 완료 포트와 연관되고 해당 소켓의 WSARECV에 대한 겹쳐진 호출이 호출됩니다.
클라이언트 테스트 프로그램을 닫을 때까지 모든 것이 잘 작동합니다.
GetQueuedCompletionStatus()
는 FALSE
를 반환하고 GetLastError
를 반환합니다
error_netname_deleted
, 그것은 나에게 의미가있는 (MSDN에 대한 설명을 읽은 후)
그러나 내 문제는
GetQueuedCompletionStatus
가 apprent return 값을 반환하기 때문에WSARecv
가 소켓 닫기로 인한 실패를 나타내는 패킷을 반환하는 것으로 생각된다고 생각했습니다. 이것은 어떤 클라이언트 소켓이 어떤 클라이언트 소켓이 오류를 일으켰는지 알지 못하고 (자유 구조물,이 특정 연결을위한 정리 등 정리)이를 해결하는 방법에 대한 제안이나 힌트?
감사합니다 :)
편집 : http://codepad.org/weyinaso <- 책임자 ... "오류 "while-loop의 첫 번째 함수의 발생 (getqueuedCompletionStatus ()의 래퍼 일어난
GetCompletionStatus()
의 호출은 다른 경우 잘 작동합니다) [그곳에 게시했으나, 여기에서 엿 같은 & 지저분 해 보이기 때문에]
해결책
GetQueuedCompletionStatus
를 호출 할 때 관심을 갖는 시나리오는 다음과 같습니다.
-
GetQueuedCompletionStatus
는TRUE
를 반환합니다. 성공적인 완료 패킷이 수신되었으며 모든 아웃 된 매개 변수가 채워졌습니다. -
GetQueuedCompletionStatus
는FALSE
를 반환합니다.lpOverlapped == NULL
: 패킷이 삭제되지 않았습니다.다른 출력 매개 변수에는 불확실성 값이 포함됩니다. -
GetQueuedCompletionStatus
FALSE
,lpOverlapped != NULL
: 이 함수는 실패한 완료 패킷을 뺀 값입니다.오류 코드는GetLastError
를 통해 사용할 수 있습니다.GetQueuedCompletionStatus
가FALSE
및lpOverlapped != NULL
를 반환하면 I / O 완료가 실패했습니다.그것은 당신이 걱정해야 할lpOverlapped
의 가치입니다.
다른 팁
이것은 오래된 질문이지만, ERROR_NETNAME_DELETED
에 대한 자세한 내용은이 페이지를 찾았습니다.겹쳐진 Readfile()
를하는 동안 얻는 오류입니다.
일부 디버깅 후에는 소켓에 쓰는 프로그램에 의해 문제가 발생했지만 closesocket()
(가비지 수집 문제로 인해)를 사용하기 전에 ExitProcess()
를 호출하는 것을 잊어 버렸습니다.Calling CloseHandle()
는 오류를 방지하지 않으며 WSACleanup()
전에 ExitProcess()
를 추가하지 않았습니다.그러나 클라이언트가 종료되기 전에 짧은 수면을 추가하여 오류가 발생하지 않았습니다.어쩌면 ExitProcess()
를 피하는 것이 문제를 방지 할 수 있습니다.
소켓을 올바르게 닫히지 않고 나가지 않고 문제가 발생하면 문제가 발생합니다.
소켓이 일반적인 파일 설명자가있는 유닉스에서 문제가 될 것이라고 생각하지 않습니다.