如何知道已建立的连接的状态?

时间:2011-10-27 09:52:07

标签: java c sockets network-programming communication

我已经看到了一些与此相关的问题,但从未遇到过我的情况可行的解决方案。我有2个通信设备通过我的代理设备进行通信。我想知道如何定期检查连接状态。代理程序在java中。方法isClosed()等不会用于此目的。我发现从流中读取不是那么有效(http://www.codeproject.com/Articles/37490/Detection-of-Half-Open-Dropped-TCP-IP-Socket-Conne.aspx)并且对缓冲流进行写入可能是有效的。但我的约束是实际的客户端和服务器是不可触及的(通信部分的C代码不能更改)。所以我想知道是否有另一种方法可以检查丢失的连接。

感谢。

2 个答案:

答案 0 :(得分:0)

套接字无法知道其本地端点和远程端点之间发生了什么,而不是没有某种通信来确定端点之间是否确实存在有效连接。知道连接是否处于活动状态的唯一方法是使用某种 ping 消息,另一端的应用程序将回复该消息。 ping 消息实际上可以是任何类型的消息,例如轮询数据或任何其他可以发送而不会导致次要影响的消息。

如果您无法更改其他应用程序的代码,是否有任何消息可以定期发送以查看连接是否还活着?

答案 1 :(得分:0)

我最近遇到了同样的问题并得出结论,最干净的解决方案是发送“空”TCP数据包,即有效负载长度为0的数据包。这会导致另一端的TCP堆栈简单发送ACK而不通知另一方的应用程序,这再次允许本地TCP堆栈确定连接是否仍然存在。

不幸的是,Java(Sun / Oracle SDK)没有提供任何发送空包的方法; write(new byte[0]);无效。

就我而言,我似乎找到了一个可能的解决方案:

sendUrgentData()可用于传输单个字节的“紧急”或"out of band"数据。这种TCP数据包被我的对等软件简单地忽略,因此不会干扰连接上的任何其他“正常”数据,并且允许我的本地TCP堆栈检测连接失败。

考虑到“OOB”数据很少被使用,有时只用一半的方式实现 - 就像Java-一样,使用这个“技巧”似乎不会干扰大多数应用程序。

除了一些简单的测试之外,我没有采用这种方法(最后使用另一种“保持活力”的方式),但它可以帮助你解决问题。这绝对值得一试。