机器的最大TCP连接数

3
我正在使用.NET创建一个Windows服务,可以让N个客户端连接。该服务启动一个TCP监听器并接受客户端连接。 我面临的问题是,我只能打开10个连接到此服务。listener::AcceptTcpClient()方法只接受10个连接,并为第11个连接抛出异常。 客户端应用程序使用System.Net.Sockets.TcpClient类,而服务使用System.Net.Sockets.TcpListener类。
当我尝试在for循环中与此服务建立多个连接(在第10个连接之后)时,我得到了以下异常:
“无法从传输连接读取数据:远程主机强制关闭了现有连接”
2个回答

4
这似乎是你遇到了Windows XP上已知的半开TCP连接10个连接限制。此限制自XP SP 2起被硬编码,除非修补系统(可能违反最终用户许可协议(IANAL)),否则无法覆盖它。遗憾的是,XP并不打算作为服务器系统。
对于Windows XP专业版,允许同时连接到网络的其他计算机的最大数量为十台。此限制包括所有传输和资源共享协议的组合。对于Windows XP Home Edition,允许同时连接到网络的其他计算机的最大数量为五台。此限制是系统允许托管的来自其他计算机的同时会话数。此限制不适用于从远程计算机附加的管理工具的使用。

限制不应该存在于服务器操作系统上。服务器操作系统被设计为(并且应该)接受许多连接。 - John Feminella
@Abhimanyu:如果客户端使用的是XP系统,则即使服务器可以接受更多的连接,它也会受到出站限制的影响。 - Richard
1
这个限制仅适用于使用TCP的某些MS应用程序协议(邮件,共享等)。这不是套接字级别的TCP连接的一般限制。也许.NET TcpClient类也适用于此限制...是否有理由使用不同的库?我知道这不是事实,因为我经常在XP和现在的Windows 7 Home / Ultimate下测试非.NET程序,其中限制为20,但我的服务器和客户端应用程序已能够建立数百个与同一主机的连接。 - Kevin Brock
1
@Richard:为什么会有出站连接限制?XP是客户端操作系统,因此应该允许向服务器建立尽可能多的套接字连接。现在,微软确实为半开放式TCP连接创建了一个限制,也就是10(显然,在Vista SP2和之后的版本中,他们停止了这个政策http://www.windowsbbs.com/general-discussions/84686-half-open-outbound-tcp-connections-limit-removed-windows-7-vista-sp2.html),但这与限制已建立的连接不同。也许OP中的服务器不能快速地完成对连接的接受。 - Kevin Brock
@Kevin:问题中没有任何内容表明服务器不在XP上(或其他客户端上)。但是看起来我确实错误地陈述了我的评论(应该说“如果服务器是...”)。 - Richard
显示剩余2条评论

3
我认为之前给出的答案无效。经过我的研究,似乎并没有任何严格限制TcpClient的原因。另一个答案暗示在Windows XP中,服务器服务有10个活动TCP连接的限制,但这仅适用于Microsoft提供的特定应用程序协议(如共享、邮件)。

但我发现Microsoft在XP SP2中添加了一些限制,并继续通过Vista SP1来限制半开放TCP连接为10。他们还将新连接数量限制为每秒内10个。这些都是为了减少病毒软件的影响。显然这些措施并不成功,所以Microsoft最终决定在Vista SP2及以后的版本中删除这些限制。

这可能是OP实际面临的问题 - 也许您正在尝试在客户端太快地创建这些连接?

正如我在之前接受的答案中提到的,我个人编写客户端/服务器软件并没有遇到10个连接的限制问题。当我进行测试时,过去使用Windows XP,现在使用Windows 7(应用程序限制现在在20个连接),我可以轻松超出这个限制。我刚刚重新测试了一下,并能够在一个主机(Windows 7 Home Premium)和另一个主机(Windows 7 Enterprise)之间创建>140个活动/已建立的连接;两个客户端操作系统。这是使用Java完成的,但.NET也应该没有什么区别(我以前也进行过测试)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接