【问题标题】:What is the maximum number of sockets that select() can handle in Windows?在 Windows 中 select() 可以处理的最大套接字数是多少?
【发布时间】:2015-02-20 09:17:41
【问题描述】:

select() 默认可以处理 64 个套接字,我可以通过在编译时覆盖 FD_SETSIZE 常量来更改此限制。但是FD_SETSIZE最多可以取多少呢?

在 Windows 下我真的应该使用select(),还是应该使用WSAEventSelect()? (不确定WSAEventSelect() 是否允许超过 64 个套接字)。

【问题讨论】:

    标签: c++ windows sockets


    【解决方案1】:

    MSDN 没有具体说明FD_SETSIZE 的上限。但是影响实际限制的因素有很多。

    1. 并发连接数限制(系统级),一般工作站1000~4000左右。

    2. 性能。 Windows 的select() 实现得非常糟糕,您应该考虑使用WSAAsyncSelect() 和完成端口来处理一千多个套接字。

    【讨论】:

    • 什么是“并发连接限制”?你的意思是我一次最多只能有 4000 个连接的套接字! WSAAsyncSelect() 和 IOCP 也可以一起使用还是我应该选择其中之一?
    • 一般情况下,正常的 Windows 没有经过严重调整,一次只能处理一到几千个同时连接,并开始返回连接失败。
    • 那么我应该如何处理 8000 个客户端连接?!
    • 谷歌它。 smallvoid.com/article/winnt-tcpip-max-limit.html 或者使用专为更高容量而设计的 Linux/BSD。
    • 也许您在谈论临时端口,而那些仅存在于客户端。我的意思是每个客户端套接字必须监听一个唯一的端口。在服务器端,所有服务器套接字都侦听同一个端口。所以在服务器端,我认为套接字的最大数量要高得多。
    【解决方案2】:
    1. 最大套接字数取决于底层 WinSock 服务提供程序(WinSock 本身只是接口包装器)。见https://msdn.microsoft.com/en-us/library/windows/desktop/ms739169(v=vs.85).aspx

    2. WSAEventSelect() 比 select() 有一些额外的功能,但 FD_SETSIZE 由两个函数处理相同。

    【讨论】:

    • 如果您对第二个索赔有参考,请分享。谢谢!
    • FD_SETSIZE 根本不由WSAEventSelect() 处理。此 API 仅处理一个套接字,而不是一组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多