我有一个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我相信虽然我不确定)。
有关可能发生的事情的任何想法?鉴于我无法访问防火墙日志并且无法更改交易服务器上的代码,我还能做些什么来调试这个?
谢谢, 麦克
答案 0 :(得分:1)
您所描述的内容很常见,实施心跳通常会像您一样通过此类防火墙/网关保持TCP套接字的活动。
硬件可能有2160分钟的超时超时(根据我的经验,20-30分钟更常见),但如果有任何负载,连接通常会更加积极地降低。这样的防火墙资源有限,当他们需要更多的连接跟踪时,无论硬件超时设置如何,他们都倾向于删除跟踪的最旧连接而没有任何活动。
如果你想再调试一下,请在防火墙的服务器端嗅一下,看看当服务器断开连接时会发生什么,如果有的话
答案 1 :(得分:0)
我会在防火墙的两侧设置wiresharp以查看TCP(和更低级别)上发生的情况。 当管理员说“连接超时”是什么的时候。这是空闲,已建立连接的超时吗?我想其他任何事都没有任何意义。
另外,您使用TCP的KeepAlive选项吗?那是由防火墙转发的吗?
正如我所说,可能想在防火墙的两侧运行wireshark ......