我有一个任务关键型实时数据应用程序,它使用客户端和服务器之间的TCP连接。在某些情况下,连接会定期死亡(SocketException)。没问题 - 只需重新连接并继续前进。但是,客户对这些间歇性的连接性下降并不感到兴奋。
我想知道在哪里指点。是客户端还是服务器?硬件还是软件?它是关于以太网链接的吗?最终结果是向用户显示连接健康状况的指示,以便可以调查和纠正错误的链接。
我是否可以从TcpClient,Socket或任何其他可以告诉我连接健康状况的指标?也许平均时间到ack,重试次数等?< / p>
我特别想知道一个TCP连接 - 不仅仅是整个以太网连接(你的局域网连接可能很花哨,但可能会有问题转到外部服务器上)。
当然我可以ping远程主机,但我认为这不会真正给我那种我正在寻找的统计数据。首先,如果服务器隐藏在NAT后面,我可能正在ping路由器。
答案 0 :(得分:5)
首先,您应该检查您获得的SocketExceptions的详细信息。我不知道它们包含在.Net中,但在Java中,详细消息提供了一个有用的提示,例如“Connection by peer”或“Connection reset”。
根据我的经验,删除套接字连接的常见原因是代码中的一个错误,其中读取超时异常由与所有其他与连接相关的异常相同的catch子句处理,因此通常导致连接被关闭没有充分的理由。
在企业设置中,关闭长连接TCP连接的典型原因是防火墙设备在没有流量的情况下关闭TCP连接,例如10分钟后,或者在年龄达到30分钟后关闭连接,无论如何交通。一般来说,最好假设这些事情会发生,并准备好优雅地重新建立连接。
一个好方法是查看连接关闭器中是否存在模式。例如,它们是定期关闭还是在没有活动的某个时间之后关闭。您还可以运行数据包嗅探器,以查看哪一方启动连接关闭或发送RST数据包以及原因。
答案 1 :(得分:1)
Perfmon是您的朋友,为所有IP,TCP和网络计数器运行日志。如果您可以判断连接何时死亡,您可以查看图表以查看是否存在任何问题 - 网络错误,无传输,没有传输IO字节等。
也添加一些.NET计数器,如GC,内存和CPU使用率。
您可以做的最后一件事是增加TCP超时和其他设置。他们是in the registry
如果远程服务器确实存在问题,你必须监控两端,但首先要查看计数器并查看是否有任何跳出来。