在 Windows 中 select() 可以处理的最大套接字数是多少?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

    最大套接字数取决于底层 WinSock 服务提供程序(WinSock 本身只是接口包装器)。见https://msdn.microsoft.com/en-us/library/windows/desktop/ms739169(v=vs.85).aspx

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

【讨论】:

如果您对第二个索赔有参考,请分享。谢谢! FD_SETSIZE 根本不由WSAEventSelect() 处理。此 API 仅处理一个套接字,而不是一组。

以上是关于在 Windows 中 select() 可以处理的最大套接字数是多少?的主要内容,如果未能解决你的问题,请参考以下文章

python select poll epoll的区别

11 Python+selenium对下拉框(select)进行处理

在 Windows 上使用 C++ 中的 Select 函数进行轮询

SELECT、SELECT COUNT 和交叉引用表可以仅由一个查询处理吗?

跟我学Nginx,nginx的连接处理方式

SQL 错误 - Windows 函数只能出现在 SELECT 或 ORDER BY 子句中