Winsock函数listen(socket,backlog)有一个参数来指定挂起连接的队列大小。程序应该通过SOMAXCONN将队列设置为其最大大小。
问题:每个Windows版本的最大队列大小是多少:2000,XP,Vista,7?
谢谢!
答案 0 :(得分:8)
在NTWS 4.0上回归5:http://support.microsoft.com/kb/127144
我相信XP也是这样,虽然从XP开始很难找到微软的具体内容。 (至少对我而言,这就是我最终希望获得实际答案的方式)。
快速安装Java测试表明,Windows 7 Pro的默认值为50,限制为200. FWIW。
我不确定为什么有人会回答这个假设为什么问这个问题。了解实际答案是有正当理由的。
例如,您有软件可能会收到大量请求。如果操作系统的最大积压数为5,则即使尽快将其关闭,也可能最终拒绝连接。积压的200减轻了这一点。因此,您可能希望使OS系统要求不使用具有此类积压限制的操作系统。
答案 1 :(得分:0)
我在Windows 7上看到它是200,但我不知道它是否与操作系统有关,或者网络驱动程序等是否会产生影响。
您可以通过侦听端口并与该端口建立大量连接来实验性地确定这一点,直到您完成为止(然后查看您有多少)。
如果您采用Len的建议并使用带有IOCP的AcceptEx,您可以通过在等待连接池中提前调用它来确定您有多大的积压。我已经看到这项工作在池中有多达1,600个连接,但它似乎也有限制。
答案 2 :(得分:0)
对于它的价值,Visual Studio 9.0(aka 2008)的异步套接字Listen()代码中的默认值为5。
我在c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include \ afxsock.h中找到了它:
BOOL Listen(int nConnectionBacklog=5);
也记录在这里: https://docs.microsoft.com/en-us/cpp/mfc/reference/casyncsocket-class?view=vs-2019#listen
答案 3 :(得分:0)
listen(socket,backlog)函数的backlog参数限制为SOMAXCONN
。如果设置为SOMAXCONN
,则负责套接字的基础服务提供商会将积压设置为最大合理值 1 。
Windows平台上的最大值为 2 :
SOMAXCONN = 5
。 Winsock 1.1是Windows 95和Windows NT 3.5的一部分。SOMAXCONN = 0x7fffffff
并将侦听积压限制为一个较大的值(通常为数百或更大)。 Winsock 2.1是Windows 95的附加组件,也是Windows 98,Windows NT 4.0和所有后续Windows版本的一部分。SOMAXCONN_HINT(N)
可用于将积压设置为比SOMAXCONN
更大的值。积压值将为N,并调整为(200,65535) 1 。注意:
“在蓝牙应用程序中调用listen()函数时,强烈建议为积压参数使用一个低得多的值(通常为2到4),因为仅接受少数客户端连接。这减少了分配给侦听套接字使用的系统资源。此建议也适用于仅需要几个客户端连接的其他网络应用程序。“ 1
来源:
答案 4 :(得分:-1)