我们的服务器应用程序正在侦听端口,一段时间后它不再接受传入连接.(虽然我很乐意解决这个问题,但这不是我在这里要求的;)
奇怪的是,当我们的应用程序停止接受端口44044上的连接时,IIS也是如此(在端口8080上).杀死我们的应用程序修复了一切 - IIS再次开始响应.
所以问题是,应用程序可以搞乱整个TCP/IP堆栈吗?或许,应用程序如何做到这一点?
无意识的细节:我们的应用程序是用C#编写的,在.Net 2.0下,在XP/SP2上.
澄清:IIS不会"拒绝"尝试连接.它永远不会看到它们.客户端正在获取"服务器未及时响应"消息(使用.Net TCP客户端.)
你很可能正在挨饿.很容易在每秒高开/关事务环境中流失,例如服务于大量未池化请求的Web服务器.
这可以通过默认的TIME-WAIT延迟来实现 - 在回收之前必须关闭套接字的时间默认为90秒(如果我没记错的话)
有一堆可以调整的注册表项 - 建议至少创建/编辑以下键
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters TcpTimedWaitDelay = 30 MaxUserPort = 65534 MaxHashTableSize = 65536 MaxFreeTcbs = 16000
MSDN和Technet上有很多关于这些密钥功能的文档.