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

我正在使用I / O-Completion端口编写一个小型服务器客户端。 我通过AcceptEx在我的完成端口上成功连接了服务器和客户端。 客户端连接后,客户端套接字与完成端口关联,并调用对该套接字上的WSARecv的重叠调用。 一切正常,直到我关闭客户端测试程序。
GetQueuedCompletionStatus()
返回
FALSE
,返回
GetLastError
  ERROR_NETNAME_DELETED ,这对我有意义(在我阅读MSDN上的描述之后)。 但我的问题是,我认为对
GetQueuedCompletionStatus
的调用将返回一个数据包,指示由于套接字关闭而导致的失败,因为
WSARecv
将返回适当的返回值。 由于情况并非如此,我不知道哪些客户端的套接字导致错误,并且无法按照我需要的方式行事(释放结构,清理此特定连接等)... 关于如何解决这个问题的任何建议,或提示? 谢谢:) 编辑:http://codepad.org/WeYINa​​sO< - 负责的代码......“错误”在while循环的第一个函数开始时发生(对
GetCompletionStatus()
的调用只是GetQueuedCompletionStatus()工作的包装器在其他情况下很好)[发布在那里,因为它看起来很糟糕&凌乱在这里]     
已邀请:
以下是调用
GetQueuedCompletionStatus
时需要注意的方案:
GetQueuedCompletionStatus
返回
TRUE
:已收到成功完成数据包,已填充所有输出参数。
GetQueuedCompletionStatus
返回
FALSE
lpOverlapped == NULL
:没有数据包出列。其他输出参数包含不确定的值。
GetQueuedCompletionStatus
返回
FALSE
lpOverlapped != NULL
:该函数已将失败的完成数据包队列化。错误代码可通过
GetLastError
获得。 要回答你的问题,当
GetQueuedCompletionStatus
返回
FALSE
lpOverlapped != NULL
时,I / O完成失败。这是你需要关注的
lpOverlapped
的价值。     
我知道这是一个古老的问题,但我发现这个页面虽然无效地搜索有关
ERROR_NETNAME_DELETED
的详细信息。这是我在重叠
Readfile()
时得到的错误。 经过一些调试后发现问题是由一个写入套接字但忘记在使用
ExitProcess()
之前调用
closesocket()
的程序引起的(由于垃圾收集问题)。调用
CloseHandle()
并没有阻止错误,也没有在
ExitProcess()
之前添加
WSACleanup()
。但是,在客户端退出之前添加短暂睡眠确实可以防止错误。也许避免
ExitProcess()
也会阻止这个问题。 所以我怀疑你的问题是由程序退出而没有正确关闭套接字引起的。 我认为这不会是Unix上的问题,其中套接字只是普通的文件描述符。     

要回复问题请先登录注册