GetQueuedCompletionStatus 在远程套接字关闭时返回 ERROR_NETNAME_DELETED

Inc*_*bus 0 winsock getlasterror io-completion-ports

我正在使用 I/O-Completion Port 编写一个小的服务器-客户端的东西。

我通过我的完成端口通过 AcceptEx 成功连接了服务器和客户端。客户端连接后,客户端套接字与完成端口相关联,并在该套接字上调用对 WSARecv 的重叠调用。

一切正常,直到我关闭客户端测试程序。 GetQueuedCompletionStatus()退货FALSEGetLastError退货

ERROR_NETNAME_DELETED

,这对我来说很有意义(在我阅读了 MSDN 上的描述之后)。

但我的问题是,我认为调用GetQueuedCompletionStatus会返回一个数据包,表明由于套接字关闭而失败,因为WSARecv会返回适当的返回值。由于情况并非如此,我不知道哪个客户端的套接字导致了错误并且无法按照我需要的方式行事(释放结构,清理此特定连接等)...

关于如何解决这个问题的任何建议或提示?

谢谢:)

编辑:http : //codepad.org/WeYINa​​sO <- 负责的代码......“错误”发生在 while 循环的第一个函数开始处(对它的调用GetCompletionStatus()只是 GetQueuedCompletionStatus() 工作正常的包装器其他情况)[确实把它贴在那里,因为它在这里看起来又脏又乱]

Aar*_*otz 6

以下是调用时需要注意的场景GetQueuedCompletionStatus

  • GetQueuedCompletionStatus返回TRUE已收到成功完成数据包,已填充所有输出参数。
  • GetQueuedCompletionStatus返回FALSE, lpOverlapped == NULL:没有数据包出列。其他输出参数包含不确定值。
  • GetQueuedCompletionStatus返回FALSE, lpOverlapped != NULL:函数使失败的完成数据包出列。错误代码可通过 获得GetLastError

为了回答您的问题,当GetQueuedCompletionStatus返回FALSE和 时lpOverlapped != NULL,I/O 完成失败。这lpOverlapped是你需要关心的价值。