我正在设计一个模拟器应用程序,其中应用程序启动到服务器的多个套接字连接(大约1000个连接)。我不希望启动尽可能多的线程来处理这些连接,因为系统无法处理那么多客户端。使用Select没有意义,因为我需要循环1000个连接,这可能很慢。请建议我如何处理这种情况。
答案 0 :(得分:3)
您希望将异步I / O与I/O Completion Port(IOCP)一起使用。
很难解释,但任何需要支持大量并发套接字的Windows应用程序都应使用IOCP。
IOCP本质上是Windows提供的线程安全工作队列。您将“完成数据包”排队到IOCP,然后另一个线程将其排队并使用它。
您还可以将支持重叠操作的多种类型的句柄(例如套接字)关联到IOCP。将句柄与IOCP关联时,WSARecv
等重叠操作会自动将完成数据包发布到关联的IOCP。
因此,基本上,您可以让一个线程处理所有1000个连接。每个套接字将创建为重叠套接字,然后与您的IOCP关联。然后,您可以在所有1000个套接字上调用WSARecv
,并等待完成数据包变为可用。收到数据后,操作系统会将完成数据包发布到相关的IOCP。这将包含相关信息,例如读取了多少数据以及包含数据的缓冲区。
答案 1 :(得分:0)
通过1000个句柄循环仍然比发送1000个数据包快得多,所以我不担心这里的性能。 select()
仍然是要走的路。