在winsock2下,select()还有什么选择?

时间:2012-12-11 17:37:49

标签: winsock winsock2

我有一个有效的多客户端,单线程TCP / IP服务器应用程序,用C ++构建,而不是基于winsock2。它的核心是使用select()等待新工作。我正在考虑将同时客户端的数量扩展到数百或数千,实际上大多数都是闲置的。我的架构为连接的空闲客户端使用非常少的内存。

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

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

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

1 个答案:

答案 0 :(得分:1)

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