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