免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7364 | 回复: 9
打印 上一主题 下一主题

[C] TCP客户端心跳检测 [复制链接]

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-09 17:59 |只看该作者 |倒序浏览
请问下做TCP客户端KEEPALIVE心跳检测 是不是需要服务器和客户端同时进行设置?  


我发现只在客户端设置并没有效果

步骤如下
初始化socket
设置socket属性,KEEPALIVE 参数设置
设置非阻塞socket

bind

connect

select
{
   读写判断
   异常判断
}

拔掉网线等待若干分钟没有一点效果,我设置的时间很短20秒开始检测, 10秒左右超时  发3次 。。。

试过很多次没有啥效果?  求教使用过的人有没有需要注意的点?


我用的是vmware ubuntu 桥接的网口。 服务端是台linux设备。

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
2 [报告]
发表于 2013-12-10 08:47 |只看该作者
有了解的童鞋吗

论坛徽章:
5
水瓶座
日期:2013-11-27 23:31:26双鱼座
日期:2014-01-02 15:37:44白羊座
日期:2014-01-07 14:30:09射手座
日期:2014-03-13 17:52:59巨蟹座
日期:2014-04-18 17:43:05
3 [报告]
发表于 2013-12-12 16:26 |只看该作者
客户端要经过若干次检测,对端都没有反应的情况下,才会认为和对端已经锻炼了,你设置KEEPALIVE属性时时结构体是怎么赋值的,你贴上来看看。

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
4 [报告]
发表于 2013-12-12 16:32 |只看该作者
TCP并不是物理上的面向连接,windows上断开网线很快就可以检测到断开,但是linux下时间较长,这个我验证过。所以尽量使用应用层的心跳包做检测。  回复 1# hanzhenlll


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-12-12 16:37 |只看该作者
这个心跳没用哈,在应用层设计心跳。

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
6 [报告]
发表于 2013-12-12 17:01 |只看该作者
回复 3# chaohona


下面是我摘出来的一些代码,,,,透过楼上几位的回答是不是代表  检测单边理论上就可以完成? 而不需要双向设置

另外请看下 我这么设置 是否存在问题

  1. #define SOL_TCP           6
  2. #define TCP_KEEPIDLE   4
  3. #define TCP_KEEPINTVL 5
  4. #define TCP_KEEPCNT    6
  5. int keepalive = 1;
  6. int keepidle = 6;
  7. int keepintvl = 5;
  8. int keepcnt = 3;

  9. if (setsockopt (fd,SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof (keepalive)) < 0 )
  10. ........

  11. if (setsockopt (fd,SOL_TCP, SO_KEEPIDLE (void *)&keepidle, sizeof (keepidle)) < 0 )
  12. .....

  13. if (setsockopt (fd,SOL_TCP, SO_KEEPINTVL, (void *)&keepinvl, sizeof (keepinval)) < 0 )

  14. ....


  15. if (setsockopt (fd,SOL_TCP, SO_KEEPCNT, (void *)&keepcnt, sizeof (keepcnt)) < 0 )

  16. ....
复制代码

论坛徽章:
5
水瓶座
日期:2013-11-27 23:31:26双鱼座
日期:2014-01-02 15:37:44白羊座
日期:2014-01-07 14:30:09射手座
日期:2014-03-13 17:52:59巨蟹座
日期:2014-04-18 17:43:05
7 [报告]
发表于 2013-12-12 17:51 |只看该作者
本帖最后由 chaohona 于 2013-12-12 17:56 编辑

你这个设置的没问题,随便你在哪面设置都可以,关键是你在哪面设置你就要在哪面判断有没有链接。
你设置了之后只有在你试图read,wirte或者select,poll那个链接的时候他才会告诉你链接已经断开了。
现在看你的情况好像是在客户端设置SO_KEEPALIVE然后在服务端判断链接是否可用。

论坛徽章:
5
水瓶座
日期:2013-11-27 23:31:26双鱼座
日期:2014-01-02 15:37:44白羊座
日期:2014-01-07 14:30:09射手座
日期:2014-03-13 17:52:59巨蟹座
日期:2014-04-18 17:43:05
8 [报告]
发表于 2013-12-12 17:55 |只看该作者
你可以看看下面的这个回复。

http://stackoverflow.com/questio ... ient-at-the-other-e

You'll get notified when the status changes when you read from the socket. If the peer is determined to be dead due to the keepalives, select/poll will notifiy the socket as readable, and a read()/recv() will return an error. You should anyway always read or monitor a socket for reading though.

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
9 [报告]
发表于 2013-12-16 10:42 |只看该作者
回复 8# chaohona


    我就是一个客户端 想实现断开重连。。。发现不好使,,,  我客户端用keepalive select 没有什么反应的,select 没办法判断我的客户端是否断开的,send 依然正常,  反倒是去掉这两个阻塞的方式 能获取到断开,虽然很低级 但也只能这么用了。。。

论坛徽章:
5
水瓶座
日期:2013-11-27 23:31:26双鱼座
日期:2014-01-02 15:37:44白羊座
日期:2014-01-07 14:30:09射手座
日期:2014-03-13 17:52:59巨蟹座
日期:2014-04-18 17:43:05
10 [报告]
发表于 2013-12-16 17:29 |只看该作者
客户端哪有select啊回复 9# hanzhenlll


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP