2011-03-29 183 views
0

我正在设计一个模拟器应用程序,其中应用程序启动多个套接字连接(大约1000个连接)到服务器。我不想启动多个线程来处理这些连接,因为系统不能处理那么多的客户端。使用选择没有什么意义,因为我需要循环1000个可能很慢的连接。请建议我如何处理这种情况。多套接字客户端连接到服务器

回答

3

您想与I/O Completion Port(IOCP)一起使用异步I/O。

这很容易解释,但任何需要支持大量并发套接字的Windows应用程序都应该使用IOCP。

IOCP本质上是一个Windows提供的线程安全工作队列。你将一个'完成数据包'排队到一个IOCP,然后另一个线程将它出队并且使用它。

您还可以将支持重叠操作的多种类型的句柄(如套接字)关联到IOCP。当您将句柄与IOCP关联时,重叠操作(如WSARecv)会自动将完成数据包发送到关联的IOCP。

所以,基本上,你可以有一个线程处理所有1000个连接。每个套接字将被创建为一个重叠套接字,然后与您的IOCP相关联。然后,您可以在所有1000个套接字上调用WSARecv,并等待完成数据包可用。当收到数据时,操作系统会将完成数据包发送到关联的IOCP。这将包含相关信息,例如读取了多少数据以及包含数据的缓冲区。

0

循环1000个句柄仍然比发送1000个数据包快得多,所以我不担心这里的性能。 select()仍然是要走的路。