我正在创建一个必须处理1000+客户端的服务器,我目前使用的方法是:
一个线程将使用WSAAccept
来处理传入的连接,它有一个线程池,每个线程将一次使用WSAPoll
处理多个客户端。
例如,如果客户端刚刚连接,服务器将找到一个空闲的poller线程,并将其添加到该poller线程的WSAPoll
的fdset中,因此poller线程将处理新的客户端连接。
轮询线程将使用非阻塞WSAPoll来处理连接,然后使用(阻塞) recv()来接收数据包。
Server: WSAAccept
Thread Poller #1: WSAPoll [1, 2, 3, 4, 5] // max out
recv[1, 2, 3, 4, 5]
Thread Poller #2: WSAPoll [6, 7, 8, 9, 10] // max out
recv[6, 7, 8, 9, 10]
Thread Poller #3: WSAPoll [11, 12] // free
recv[11, 12]
// create more pollers if all maxed out
它对我很好,但后来我发现了一个(可能是)更好的解决方案,使用重叠套接字和。
这里的想法是使用非阻塞的WSARecv
完成回调,而不是使用WSAPoll
。
CompletionCallback(){ WSARecv(socket, CompletionCallback); }
Loop:
socket = WSAAccept();
WSARecv(socket, CompletionCallback); // CompletionCallback will handle the connection.
因此,不需要多线程和/或WSAPoll
,我已经制作了一个PoC,它似乎工作得很好,但它是一个线程,我想知道与旧方法相比,它的性能如何。
谢谢!
发布于 2022-05-29 03:01:12
重叠的I/O尺度非常好--缩小/放大/缩小。我的工具使用带有重叠I/O + Nt线程池的AcceptEx。它可以很好地扩展到成千上万的连接。https://github.com/Microsoft/ctsTraffic
https://stackoverflow.com/questions/72409685
复制相似问题