2009-09-10 115 views
1

我有一个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我相信虽然我不确定)。

关于可能会发生什么的任何想法?考虑到我无法访问防火墙日志并且无法更改交易服务器上的代码,我该怎么做才能进行更多的调试?

谢谢, 迈克

回答

1

你描述的现象很普遍,这是共同实施的心跳,保持TCP套接字活着通过像这样的防火墙/网关你做到了。

该硬件可能会有2160分钟的超时时间(根据我的经验,20-30分钟更常见),但如果存在任何类型的负载,连接通常会大幅下降。这样的防火墙资源有限,并且当他们需要更多的连接跟踪时,无论设置硬超时如何,他们都倾向于丢弃最早的连接,而无需任何活动。

如果你想调试这更多信息,请在防火墙的服务器端嗅,看看是否点儿什么,会发生什么,当服务器获取断开

+0

谢谢,只是想确保我在赛道与防火墙假设。在从防火墙到交易服务器的路径上,他们不会为我捕获任何东西。最后,它变成了防火墙。尽管我要求10x确认端口号,但他们已经解开了错误的端口。 – 2009-09-11 18:19:18

0

我会在防火墙的两侧设置wiresharp看到TCP(下水平)会发生什么。 而当管理员说“连接超时”是什么。这是一个空闲,建立连接的超时?其他任何东西都没有任何意义,我猜。

此外,您是否使用TCP的KeepAlive选项?并且是否由防火墙转发?

正如我所说的,可能要运行在防火墙的两侧Wireshark的...