我们的服务器应用程序正在监听一个端口,一段时间后它不再接受传入的连接。 (虽然我很想解决这个问题,但这不是我在这里要问的;)
奇怪的是,当我们的应用程序停止接受端口 44044 上的连接时,IIS(端口 8080)也是如此。终止我们的应用程序可以解决所有问题 - IIS 再次开始响应。
所以问题是,一个应用程序会不会弄乱整个 TCP/IP 堆栈?或者,应用程序如何才能做到这一点?
毫无意义的细节:我们的应用程序是在 .Net 2.0 下,在 XP/SP2 上用 C# 编写的。
澄清:IIS 并非“拒绝”尝试的连接。它永远不会看到它们。客户端收到“服务器未及时响应”消息(使用 .Net TCP 客户端。)
最佳答案
您可能正在挨饿堆栈。在每秒高打开/关闭事务的环境中很容易耗尽,例如服务于大量未合并请求的网络服务器。
默认的 TIME-WAIT 延迟加剧了这一点——套接字在被回收之前必须关闭的时间默认为 90 秒(如果我没记错的话)
有很多可以调整的注册表项 - 建议至少创建/编辑以下项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
TcpTimedWaitDelay = 30
MaxUserPort = 65534
MaxHashTableSize = 65536
MaxFreeTcbs = 16000
MSDN 和 Technet 上有大量关于这些键的功能的文档。
关于c# - 可以通过编程方式终止 TCP/IP 堆栈吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/133442/