【发布时间】:2013-12-31 21:52:44
【问题描述】:
我有一个使用 IOCP、套接字和重叠的服务器。最初一切都很好。侦听套接字使用 IOCP 上的 AcceptEx 传递给新创建的套接字。我可以很好地处理数千个连接。
当服务器进程处理落后时,它会关闭并断开监听端口。当它赶上来时,它将使用新的 IOCP 重新建立侦听端口。
我遇到的问题是,在重新建立侦听端口后,新连接到达后,我尝试使用与上述完全相同的代码路径来接受。 AcceptEx 失败并显示 WSAEINVAL。
我知道我遗漏了一些细节(魔鬼总是在细节中,不是吗?)——但希望能在我应该寻找的地方提供帮助。
如果有好奇的人想了解更多信息,我很乐意提供。
【问题讨论】:
-
“断开监听端口”没有意义,你不能断开一个端口,只能断开一个连接的套接字。不说了,贴代码。
-
删除端口 -- 因为不再监听。恐怕代码相当丰富。我不是原作者,只是修复它的咕噜声。
-
“删除端口”也没有任何意义。我认为他的意思是“关闭监听套接字”和/或关闭 IOCP。我不确定。
-
粗鲁的人群。但我怀疑措辞精度是必要的,或者有太多的回旋余地或解释。关闭监听套接字是正确的。 netstat 将不再显示正在监听的端口。当内部情况发生变化,服务器开始监听端口时,AcceptEx 在接受新连接时失败。
-
如果您认为 windows 标记人群很粗糙,请尝试使用标记为 C++ 的问题提出模棱两可的问题。那些家伙重新定义了严厉的爱。但我离题了......无论如何,如果你没有展示任何证明问题的最小示例代码,我必须使用我的精神力量。我的通灵能力表明,您作为第一个参数传递给 AcceptEx 的套接字标识符是您在返回侦听新套接字之前关闭的套接字的句柄。
标签: windows iocp winsockets