IOCP,AcceptEx,重叠和WSAEINVAL

时间:2013-12-31 21:52:45

标签: windows iocp winsockets

我有一台使用IOCP,套接字和重叠的服务器。最初一切都很棒。侦听套接字使用IOCP上的AcceptEx切换到新创建的套接字。我可以很好地处理成千上万的连接。

当服务器进程在处理过程中落后时,它将关闭并断开侦听端口。当它重新启动时,它将使用新的IOCP重新建立侦听端口。

我遇到的问题是,在重新建立侦听端口并且新连接到达之后,我尝试接受使用与上面完全相同的代码路径。 AcceptEx因WSAEINVAL而失败。

我知道我遗漏了一些细节(魔鬼总是在细节中,不是吗?) - 但是我会很感激能帮到我应该去看的地方。

如果一个好奇的灵魂想要更多的信息,我会乐意提供。

2 个答案:

答案 0 :(得分:1)

很难猜出你的问题可能会给你什么,不显示任何源代码,但是......

  1. 无需关闭侦听套接字,只需停止发布新的AcceptEx()调用,服务器将无法接受任何新连接。

  2. 如果您确实要关闭侦听套接字,请不要关闭IOCP,并确保在重新创建侦听套接字时使用相同的IOCP。

答案 1 :(得分:0)

我会回答我自己的问题,因为我已经找出了潜在的问题。对问题至关重要的一件事是,但问题陈述中没有说明服务器有子流程。

事实证明,虽然windows中的默认行为是没有子进程继承的句柄,但winsock的行为却相反:句柄由子进程继承,除非在创建时显式设置为no-inherit。

使用不可继承的句柄创建套接字解决了这个问题。我希望这可以帮助那些遇到这个问题的人。