我有一个小型便携式工具,连接到不同位置的大约150台服务器,以便从中进行快速状态检查。将所有服务器的状态相对快速地返回给用户非常重要,这样工具就可以使用非阻塞连接并行连接到服务器,并使用select()来确定每个套接字何时就绪。 select()的使用相当简单,而且该工具现在已经成熟并且在Linux上运行良好。它运行在Windows XP上,但是与绝大多数服务器的连接都没有完成。该工具错开了连接的调用,以避免创建看起来像SYN泛洪的东西。它连接到一台服务器大约100毫秒。我还有一个检查,以确保不违反FD_SETSIZE。我有来自其他人的轶事证据表明,在以后的Windows版本中行为更好,但无法验证。
我使用WinDump来验证是否正在发送syn数据包,我可以看到ack数据包返回,但是select()保持返回零,并且代码根本无法连接到大多数存在的服务器,我可以在Linux上使用相同的代码连接到正常。
有没有人看到或解决过许多非阻塞连接的类似问题并在Windows XP上选择?
答案 0 :(得分:0)
经过一天左右的挖掘,我似乎找到了答案。在Windows XP SP2上,系统范围内有10个并发连接套接字限制。如果存在10个或更多半开连接,则会记录一个System事件,指出已达到限制,并且静默限制新的连接套接字。系统事件编号为4226。
我通过添加Windows XP的版本检查来修复我的代码,并在这些系统上限制为少于10个连接。到目前为止,我还没有其他版本受到影响的报道。