1

我需要在单个进程中启动 1000 个客户端连接,我需要解决的关键限制是驱动程序不支持 ConnectEx,因此我无法拥有纯 IOCP 解决方案。

我的第一个想法是处理连接的线程池,其中每个句柄可以使用普通的连接/选择语义处理多达 64 个连接,一旦连接就继续使用 IOCP。但这行不通;一旦选择运行,我就不能向 FD_SET 添加另一个套接字。所以我必须将套接字设置为非阻塞并轮询它们。
最好的解决方案可能是最简单的;每个线程一个连接客户端。假设我可以保持合理的连接率,池中的线程数可能会很小。

这是一个奇怪的情况,理想情况下,驱动程序会支持 ConnectEx,但它(目前)不支持,我需要以最好的方式解决它。

还有其他方法吗?

4

1 回答 1

3

首先,可以select使用虚拟套接字(例如,连接到自身的 UDP 套接字)来破坏,尽管在您的情况下这可能代价高昂。

如果您有一个可以处理周围消息的窗口,您可以使用它WSAAsyncSelect来获取connect. (请注意,这也会自动使您的套接字非阻塞,这需要再次调用WSAAsyncSelect并调用ioctlsocket禁用)。

缺少它,您可以使用WSAEventSelect,尽管您会发现这将您限制为每次等待 64 个套接字(因为这是 的上限WaitForMultipleObjects)。这也将使您的套接字成为非阻塞的,您可以像为WSAAsyncSelect.

(作为一个完整的旁注,您可以通过在 include之前select定义来增加处理的套接字数量)FD_SETSIZEwinsock2.h

于 2011-10-23T14:59:09.430 回答