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