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