【问题标题】:Under winsock2, what alternative is there to select()?在winsock2下,select()有什么替代方法?
【发布时间】: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() 的替代品有哪些?

【问题讨论】:

    标签: winsock winsock2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-20
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多