我有一个在裸winsock2 上用C++ 构建的多客户端、单线程TCP/IP 服务器应用程序。它的核心是select()
等待新的工作去做。我正在考虑将同时客户端的数量扩展到数百或数千个,实际上所有这些都是空闲的。我的架构为连接的空闲客户端使用了很少的内存。
在每一个之前select()
,我构建了一个fd_set
处于读取状态的客户端套接字,以及我的监听套接字(用于接受新连接);和另一个fd_set
处于写入状态的套接字。然后,在 之后select()
,我扫描这些以从套接字号重建我的客户是哪一个。这种fd_set
构建和扫描,虽然客观上不是当前的 CPU 瓶颈,但让我感到不安:每个事务的工作量随着客户端数量线性增长;虽然我看到了如何超越默认的 64-sockets 限制fd_set
,但我不愿意走那条路。
我隐约看到如何使用两个线程,一个处理少数最活跃的客户端,另一个处理大量空闲客户端。这似乎可行,但有点复杂。
那么:select()
winsock2下的替代方案是什么?