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

What is the maximum number of sockets that select() can handle in Windows?

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

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

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

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

MSDN 没有具体说明 FD_SETSIZE 的上限。然而,有许多因素会影响实际限制。

  1. 并发连接限制(系统方面),一般工作站上约为1000~4000。

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