1

我有一个在裸winsock2 上用C++ 构建的多客户端、单线程TCP/IP 服务器应用程序。它的核心是select()等待新的工作去做。我正在考虑将同时客户端的数量扩展到数百或数千个,实际上所有这些都是空闲的。我的架构为连接的空闲客户端使用了很少的内存。

在每一个之前select(),我构建了一个fd_set处于读取状态的客户端套接字,以及我的监听套接字(用于接受新连接);和另一个fd_set处于写入状态的套接字。然后,在 之后select(),我扫描这些以从套接字号重建我的客户是哪一个。这种fd_set构建和扫描,虽然客观上不是当前的 CPU 瓶颈,但让我感到不安:每个事务的工作量随着客户端数量线性增长;虽然我看到了如何超越默认的 64-sockets 限制fd_set,但我不愿意走那条路。

我隐约看到如何使用两个线程,一个处理少数最活跃的客户端,另一个处理大量空闲客户端。这似乎可行,但有点复杂。

那么:select()winsock2下的替代方案是什么?

4

1 回答 1

1

如您所见,select()它在一次调用中可以处理的套接字数量有一个最大限制。如果可伸缩性对您来说是个问题,那么您应该改用重叠 I/O 或 I/O 完成端口。这样,您可以在需要时对单个套接字发出读/写操作,并且操作系统会在工作完成时通知您,无需轮询。

于 2012-12-11T20:12:40.027 回答