在 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() 可以处理的最大套接字数是多少?的主要内容,如果未能解决你的问题,请参考以下文章
11 Python+selenium对下拉框(select)进行处理
在 Windows 上使用 C++ 中的 Select 函数进行轮询