2011-10-23 30 views
1

我需要启动客户端1000的在一个单一的过程连接,我需要解决的关键限制因素是驱动程序不支持ConnectEx,所以我不能有一个纯IOCP解。非阻塞套接字在Windows连接不ConnectEx

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

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

还有别的办法吗?

回答

3

首先,有可能使用虚拟套接字(例如,连接到自己的UDP套接字)打破select,尽管这可能在您的情况下代价很高。

如果您有一个可以处理消息的窗口,则可以使用WSAAsyncSelect获取connect的异步通知。 (注意,这也会自动使您的套接字非阻塞,这需要另一个呼叫WSAAsyncSelect和致电ioctlsocket禁用)。

由于缺乏这一点,您可以使用WSAEventSelect,不过您会发现这会限制您每次等待64个套接字(因为这是WaitForMultipleObjects的上限)。这也会使你的套接字非阻塞,你可以类似于WSAAsyncSelect所做的那样撤消套接字。

(作为一个完整侧面说明,您可以通过包括winsock2.h之前定义FD_SETSIZE增加select处理插槽数)

+0

WSAAsyncSelect和WSAEventSelect都有益无害。我想我会以每个连接一个线程开始,然后使用这两个连接中的一个将连接汇集到64个组中。谢谢。 – hplbsh

+0

我没有注意到WSAAsyncSelect使用Windows消息。讨厌,但可能非常有帮助。 – hplbsh