【发布时间】:2015-02-20 09:17:41
【问题描述】:
select() 默认可以处理 64 个套接字,我可以通过在编译时覆盖 FD_SETSIZE 常量来更改此限制。但是FD_SETSIZE最多可以取多少呢?
在 Windows 下我真的应该使用select(),还是应该使用WSAEventSelect()? (不确定WSAEventSelect() 是否允许超过 64 个套接字)。
【问题讨论】:
select() 默认可以处理 64 个套接字,我可以通过在编译时覆盖 FD_SETSIZE 常量来更改此限制。但是FD_SETSIZE最多可以取多少呢?
在 Windows 下我真的应该使用select(),还是应该使用WSAEventSelect()? (不确定WSAEventSelect() 是否允许超过 64 个套接字)。
【问题讨论】:
MSDN 没有具体说明FD_SETSIZE 的上限。但是影响实际限制的因素有很多。
并发连接数限制(系统级),一般工作站1000~4000左右。
性能。 Windows 的select() 实现得非常糟糕,您应该考虑使用WSAAsyncSelect() 和完成端口来处理一千多个套接字。
【讨论】:
WSAAsyncSelect() 和 IOCP 也可以一起使用还是我应该选择其中之一?
最大套接字数取决于底层 WinSock 服务提供程序(WinSock 本身只是接口包装器)。见https://msdn.microsoft.com/en-us/library/windows/desktop/ms739169(v=vs.85).aspx
WSAEventSelect() 比 select() 有一些额外的功能,但 FD_SETSIZE 由两个函数处理相同。
【讨论】:
FD_SETSIZE 根本不由WSAEventSelect() 处理。此 API 仅处理一个套接字,而不是一组。