我需要在一个进程中启动1000个客户端连接,我需要解决的关键限制是驱动程序不支持ConnectEx,所以我不能拥有纯IOCP解决方案。
我首先想到的是一个处理连接的线程池,每个句柄可以使用普通连接/选择语义处理多达64个连接,并且一旦连接就继续使用IOCP。 但这不行;一旦select正在运行,我就无法向FD_SET添加另一个套接字。所以我必须将套接字设置为非阻塞,然后轮询它们 最好的解决方案可能是最简单的;每个线程一个连接客户端。假设我可以保持连接速率合理,池中的线程数可能很小。
这是一个奇怪的情况,理想情况下,驱动程序会支持ConnectEx,但它不支持(现在),我需要以最好的方式解决它。
还有其他办法吗?
答案 0 :(得分:3)
首先,可以使用虚拟套接字(例如,连接到自身的UDP套接字)来中断select
,但在您的情况下这可能会很昂贵。
如果您有一个可以处理消息的窗口,则可以使用WSAAsyncSelect
获取connect
的异步通知。 (请注意,这也会自动使您的套接字无阻塞,这需要另一次调用WSAAsyncSelect
并调用ioctlsocket
来禁用)。
缺少这一点,您可以使用WSAEventSelect
,但是您会发现这会限制您每次等待64个套接字(因为这是WaitForMultipleObjects
的上限)。这也会使您的套接字无阻塞,您可以撤消与WSAAsyncSelect
相同的内容。
(完整的注意事项,您可以通过在包含select
之前定义FD_SETSIZE
来增加winsock2.h
处理的套接字数量)