Winapi 连接到服务器的多套接字客户端

Winapi 连接到服务器的多套接字客户端,winapi,sockets,winsock,winsock2,Winapi,Sockets,Winsock,Winsock2,我正在设计一个模拟器应用程序,其中应用程序启动到服务器的多个套接字连接(大约1000个连接)。我不想启动那么多线程来处理这些连接,因为系统无法处理那么多客户端。使用Select没有意义,因为我需要循环1000个连接,这可能会很慢。请告诉我如何处理这种情况。通过1000个句柄循环仍然比发送1000个数据包快得多,因此我不会担心性能问题select()仍然是一条路。通过1000个句柄循环仍然比发送1000个数据包快得多,因此我不必担心这里的性能选择() 简短地解释太多了,但是任何需要支持大量并发套接

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

通过1000个句柄循环仍然比发送1000个数据包快得多,因此我不会担心性能问题
select()
仍然是一条路。

通过1000个句柄循环仍然比发送1000个数据包快得多,因此我不必担心这里的性能<代码>选择()

简短地解释太多了,但是任何需要支持大量并发套接字的Windows应用程序都应该使用IOCP

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

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


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

您希望将异步I/O与(IOCP)一起使用

简短地解释太多了,但是任何需要支持大量并发套接字的Windows应用程序都应该使用IOCP

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

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

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