+ -
当前位置:首页 → 问答吧 → 求教socket通信时,心跳检查问题。。

求教socket通信时,心跳检查问题。。

时间:2010-06-29

来源:互联网

请教一下关于心跳检查的问题。
我最近使用到SOCKET,我写了个client 端和服务端的程序,我测试发现,在关闭client端时,服务端不停的read到长度为0的消息,同时netstat -an发现close_wait,
我教高手们一下:
1.如果关闭了client端,服务端怎么测出是对方已经关闭了而不是其它的错误?我通过select发现,返回还是1.
2.我在连接正常的时候把网线拔掉,这个时候client阻塞在write上,server端阻塞在read上,同时netstat -an 发现还是正常连接。请教下这时怎么可以检测通信已断呢?
3.我在网上查到在应用层使用心跳检测可以,我想请教下这种应用层心跳检测的模型是什么样的,具体怎么实现?

谢谢,希望可能得到详细的指点。

作者: sum_cn   发布时间: 2010-06-29

收发心跳包+超时检查。

作者: 没本   发布时间: 2010-06-29

1.如果关闭了client端,服务端怎么测出是对方已经关闭了而不是其它的错误?我通过select发现,返回还是1.

   recv 返回0 对端正常关闭, recv 返回-1 对端异常关闭,
2.我在连接正常的时候把网线拔掉,这个时候client阻塞在write上,server端阻塞在read上,同时netstat -an 发现还是正常连接。请教下这时怎么可以检测通信已断呢?
   你的是什么机器 拔的是哪端的网线 按道理说网线掉了 网卡应该能检测到, 是对端检测不到, 你把路由去掉或者中间交换机 路由器 掉了 可能两端都不知道, 但是这样实际没有问题, 网络恢复了 继续用. 通过心跳包检测.

作者: qianhulou   发布时间: 2010-06-29

你的是什么机器 拔的是哪端的网线 按道理说网线掉了 网卡应该能检测到, 是对端检测不到, 你把路由去掉或者中间交换机 路由器 掉了 可能两端都不知道, 但是这样实际没有问题, 网络恢复了 继续用. 通过心跳包检测.

我没说清楚,,我是把网卡禁掉了。。

我知道心跳包具体是怎么实现的,我想知道具体模型?

我这样设想,不知道对不对。。
1.client端,定时发送包,同时在发送消息时,使用select定时,如果超时就认定了断开关闭套接字,重新连接。
2.server端,select定时接收,在read长度为0或者超时就认定是断了,断开关闭套接字,重新监听。

不知道是不是这样。

作者: sum_cn   发布时间: 2010-06-29