在windows XP上的许多非阻塞连接TCP套接字上使用select()缺少连接

在windows XP上的许多非阻塞连接TCP套接字上使用select()缺少连接,select,winsock,Select,Winsock,我有一个小型便携式工具,它可以连接到不同位置的大约150台服务器,以便快速检查它们的状态。必须相对快速地将所有服务器的状态返回给用户,以便该工具使用非阻塞连接并行连接到服务器,并使用select()确定每个套接字何时准备就绪。select()的使用相当简单,该工具现在已经成熟,在Linux上运行良好。它在windows xp上运行,但与绝大多数服务器的连接尚未完成。该工具交错调用以连接,以避免创建类似SYN洪水的情况。它连接到一台服务器大约100毫秒。我还进行了检查,以确保未违反FD_SETSI

我有一个小型便携式工具,它可以连接到不同位置的大约150台服务器,以便快速检查它们的状态。必须相对快速地将所有服务器的状态返回给用户,以便该工具使用非阻塞连接并行连接到服务器,并使用select()确定每个套接字何时准备就绪。select()的使用相当简单,该工具现在已经成熟,在Linux上运行良好。它在windows xp上运行,但与绝大多数服务器的连接尚未完成。该工具交错调用以连接,以避免创建类似SYN洪水的情况。它连接到一台服务器大约100毫秒。我还进行了检查,以确保未违反FD_SETSIZE。我从其他人那里得到的轶事证据表明,在以后的windows版本中,这种行为会更好,但我无法验证

我使用WinDump来验证syn数据包是否被发送,我可以看到ack数据包返回,但select()始终返回零,代码无法连接到大多数现有的服务器,我可以在Linux上使用相同的代码连接到服务器


是否有人在Windows XP上看到或解决了许多非阻塞连接和选择的类似问题?

经过一天左右的挖掘,我似乎找到了答案。在windows XP SP2上,系统范围内的并发连接套接字限制为10个。如果存在10个或更多半开连接,则会记录一个系统事件,指出已达到限制,并且新的连接插座会被无声地节流。系统事件编号为4226


我通过添加Windows XP版本检查修复了我的代码,并将这些系统上的连接限制为不到10个。到目前为止,我还没有其他版本受到影响的报告。

我从未做过类似的事情,但您可以将工作分为多个进程吗?如果不看到您的选择处理,很难给出答案。但是您应该检查,对于每个select返回,您的连接是否都被接受。您可能需要多次检查FD_是否已设置。