-1

我有一个使用 IOCP、套接字和重叠的服务器。最初一切都很好。侦听套接字使用 IOCP 上的 AcceptEx 传递给新创建的套接字。我可以很好地处理数千个连接。

当服务器进程处理落后时,它会关闭并断开监听端口。当它赶上来时,它将使用新的 IOCP 重新建立侦听端口。

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

我知道我遗漏了一些细节(魔鬼总是在细节中,不是吗?)——但希望能在我应该寻找的地方提供帮助。

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

4

2 回答 2

1

鉴于您没有显示任何源代码,很难猜测您的问题可能是什么,但是......

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

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

于 2014-01-01T15:27:58.563 回答
0

我会回答我自己的问题,因为我已经弄清楚了根本问题是什么。对问题至关重要但在问题陈述中未说明的一件事是服务器具有子进程。

事实证明,虽然 windows 中的默认行为是不让子进程继承句柄,但 winsock 的行为恰恰相反:除非在创建时明确设置为 no-inherit,否则句柄由子进程继承。

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

于 2014-05-16T17:27:28.420 回答