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