Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

如何探测socket是否保持SO_KEEPALIVE??

Posted on 2009-02-03 11:06 Prayer 阅读(4070) 评论(0)  编辑 收藏 引用 所属分类: SOCKET
一个客户端通过交换机连接了多个服务器,如果一个服务器出了问题,客户端如何快速知道那个连接已经断开了?我尝试使用了setsockopt,将socket设置为so_keepalive,虽然返回值显示设置成功了,但并不起作用,请问有什么解决办法??
答:SO_KEEPALIVE是有周期的,当然不会因为SO_KEEPALIVE就能马上检测蛭断开了。
答:客户端和服务器都面对这个问题当对方以外吊线,本地无法得知,这个问题的普遍方法是发送心跳信息,TCP是可靠的,发送心跳信息失败表示连接已经断开,觉得对的话给我点分
答:心跳包是常用的方法~~~
答:我用SO_KEEPALIVE等了十分钟都没反应,怎么调整周期?心跳包是什么东西,能否说的详细些?
答:所谓心跳包是客户端和服务器之间进行的一种连接测试使用的数据包,是用户自定义的一种数据,数据是封装在TCP协议中作为数据净核部分的,事实上是一种应用协议。内容可以为空,在包头部分设置相应的字段,在服务器端收到数据包之后检查包头,包头如果是心跳包类型,则说明该socket连接的客户端在线,而客户端则是定时发送这样的数据包,例如1分钟一次。可以设置服务器验证心跳数据的超时时间为3分钟,也就是说如果连续的3个心跳包服务器收不到,则判断客户端已经断开!
答:设置这些东西需要在连接之前,还是在连接之后,还是两者皆可?
答:这些设置是在程序设计的时候用的,事实上心跳包是程序员在设计程序的时候自己设置的,心跳包是ip数据包中的数据净核部分,和普通的数据传输一样,只是在传输到另一端时,需要接受端判断数据类型,是需要处理的事务数据,还是心跳数据,这需要程序设计者在设计程序的时候对数据协议进行自定义设置,说穿了就是自己定义一套应用层的协议。简单举例:对于客户端connect之后可以启动一个定时器,定时为1分钟,客户端正常发送各种事务数据,定义数据格式¦数据头¦数据长度¦数据内容¦当计时器到1分钟时,客户端向服务器发送一个数据长度为零,内容为空的数据,假定正常事务数据的数据头为值为1~255,则可以定义心跳包数据头的值为0,即发送一个¦0¦0¦¦这样一个数据。当服务器收到客户端连接之后也启动一个计时器,这时可能有多个客户端连接,需要轮询各个连接的计时器,当计时器超过3分钟,则判断该连接断开,对于有效连接,当它数据之后,解析数据,先读数据头,当数据头值为1~255可以转入相关的处理过程,当收到数据头值为0的时候要将计时器归0,重新计时。
答:一个客户端通过交换机连接了多个服务器,这种情况根据socket事件已经不大可靠了,尤其是大负荷服务器,比如msn,qq,skype等,通常断开一分钟以上才通知到,这就是采用心跳才检测的。而且如果是UDP连接的话,也只能心跳检测。方法如楼上说的,还可以简化一下:每隔10秒(间隔时间可以自己设置)向服务器查询一下,返回值正常就表示在线,设数器清0。如果没有返回或返回值异常,计数加1。连接三次没收到返回值就说明掉线了。
答:上面方法有个问题要自己处理好:UDP是面向无连接的,所以收方要对数据进行排序,避免先处理后到的数据。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理