我有一个运行良好几年的 C# 应用程序。它通过 TCP/IP 套接字连接到向我发送股票交易执行的机器。
最近,我尝试将它部署到位于硬件防火墙后面的新数据中心的一些机器上,我开始看到一些奇怪的断开连接。
当发生断开连接时,在我的应用程序(客户端)中,除了我停止通过套接字接收数据外,我没有看到任何异常。当我在调试器中停止它时,Wireshark 确认没有数据到达套接字,并且我的应用程序的接收线程在 Receive() 调用上阻塞。套接字在 netstat 中显示为 ESTABLISHED。
但从服务器端来看,我的客户端似乎正在断开连接。查看他们的日志,看起来他们末端的套接字通常以 (nRecvd=-1,errno=104) 或 (nRecvd=0,errno=11) 结尾。(104 是对等方重置连接)。
断开连接似乎仅在一段时间不活动后发生。我现在已经通过在我的客户端和他们的服务器之间实现心跳来解决这个问题,该心跳每 20 秒发送一条短消息并得到回复。这导致过去几天的断开连接数降至 0。
起初,我认为硬件防火墙是问题所在。它导致套接字在不活动后超时。但是防火墙负责人声称,这个端口(8887)的连接超时时间是2160分钟。
我正在运行 Windows Server 2003 和 .NET 3.5。交易服务器是一台 linux 机器(虽然我不确定,但我相信 sles9)。
关于可能发生的事情有什么想法吗?鉴于我无法访问防火墙日志并且无法更改交易服务器上的代码,我能做些什么来调试更多?
谢谢,迈克