高性能C#TCP服务器问题:由于目标计算机主动拒绝连接,因此无法建立连接



根据您的建议,我开发了一个TCP服务器:C#中的高性能TCP服务器

它基于异步模式。

我还开发了一个压力测试应用程序来测试它的性能。我的服务器可以从我的压力测试应用程序并行地获得数千个连接,可以解析数据并将其保存到我的数据库中。

当我向服务器施压时,我可以从服务器上得到"System.Net.Sockets.SocketException"由于目标计算机主动拒绝,无法建立连接"错误,所以我必须重新连接到它。如果我用5000个并发连接测试它,我必须再次尝试连接,因为这个问题10-20%的连接,如果我用10K并发连接测试,可能是30-40%。有时它可以——很少——超过50%。它似乎无法处理连接接受:我在压力测试中建立了新的连接,就像我的测试机器所能做到的那样——大约120个连接/秒。

那么,是什么导致了这种异常呢?如何处理?在服务器端实现中应该做些什么来避免这个问题?如何调整TCP连接接受?

提前感谢!

您可能不时会用完可用的端口。您可以使用SysInternal的TcpView实用程序轻松地查看此信息。

在Windows上,当您释放端口时,它不会立即进入可用状态,而是在一段时间内处于TIME_WAIT状态。在离开此状态之前,任何应用程序都不能使用此端口。时间延迟、端口的最大数量和可用端口范围都与操作系统、XP与Win7与Win2008 Server不同。

有两个注册表项可以缩短此时间间隔:HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/TCPTimedWaitDelay

并增加应用程序可以打开的最大端口数:HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/MaxUserPort

编辑:MaxFreeTcbs似乎是第三个可能有帮助的设置(我还没有尝试过),在TechNet的这篇文章中提到了这一点,这篇文章对追踪奇怪的网络问题有更多建议。HTH。

您建立连接的速度快于软件侦听新连接的速度,或者换句话说,您正在达到该端口的每秒连接数限制。我认为,通过侦听第二个端口,您可以将每秒连接数增加一倍,客户端应该在收到异常时重新连接。

连接量也有限制,请参见Chris O的回答。

最新更新