在没有ConnectEx的Windows上连接非阻塞套接字

时间:2011-10-23 13:45:58

标签: windows sockets iocp io-completion-ports

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

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

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

还有其他办法吗?

1 个答案:

答案 0 :(得分:3)

首先,可以使用虚拟套接字(例如,连接到自身的UDP套接字)来中断select,但在您的情况下这可能会很昂贵。

如果您有一个可以处理消息的窗口,则可以使用WSAAsyncSelect获取connect的异步通知。 (请注意,这也会自动使您的套接字无阻塞,这需要另一次调用WSAAsyncSelect并调用ioctlsocket来禁用)。

缺少这一点,您可以使用WSAEventSelect,但是您会发现这会限制您每次等待64个套接字(因为这是WaitForMultipleObjects的上限)。这也会使您的套接字无阻塞,您可以撤消与WSAAsyncSelect相同的内容。

(完整的注意事项,您可以通过在包含select之前定义FD_SETSIZE来增加winsock2.h处理的套接字数量)