socket keepalive 断线重连

yiyefangzhou24 2013-08-15 11:30:11
现在情况如下
客户端在内网,所有的请求只能客户端主动发起,客户端和服务器均采用keepalive保活机制,问题就来了,当有一方的物理链接断开。客户端如何检测到链接已断重新发起连接,而服务器又如何知道连接断开而更新链接列表?
...全文
511 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiyefangzhou24 2015-12-15
  • 打赏
  • 举报
回复
两边都设定心跳
海草舞2019 2015-12-10
  • 打赏
  • 举报
回复
@yiyefangzhou24 楼主, 问题是怎麽解决的, 求回复!!!
max_min_ 2013-08-15
  • 打赏
  • 举报
回复
引用 5 楼 yiyefangzhou24 的回复:
[quote=引用 4 楼 max_min_ 的回复:] [quote=引用 3 楼 yiyefangzhou24 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 对的, 你发心跳包会有回复的,发了几次心跳包没有回复,或者多久没有收到心跳包, 就认为这条链路已经坏掉,需要关闭重新连接请求 至于你那边发心跳,根据实际情况!
现在问题就在于哪边发,如果客户端发是可以,但是服务器不知道原来的那条链是否断开,产生死链。 如果服务器发同理,客户端就不是产生死链这么严重了,就是永远不可能再和服务器脸上 两边都发?然后两边都keepalive?效率?[/quote] 1 如果客户端发, 几次没有接收到服务端的回复,就认为这链路已经坏了,关闭重新链接 服务端一段时间没有接收到心跳包,也认为这链路已经坏了,关闭链路 2 如果服务端发,同理![/quote] 其实我之前就是用的这种办法,但是我没有让他keepalive 结果一段时间过后客户端莫名其妙的不连在服务端上了,也不太好调试原因,是keepalive的原因吗[/quote] 显然, 服务端在一定时间没有收到心跳包,应该会认为链路已经坏掉,关闭了这个socket的! 客户端需要重新connect了
yiyefangzhou24 2013-08-15
  • 打赏
  • 举报
回复
引用 4 楼 max_min_ 的回复:
[quote=引用 3 楼 yiyefangzhou24 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 对的, 你发心跳包会有回复的,发了几次心跳包没有回复,或者多久没有收到心跳包, 就认为这条链路已经坏掉,需要关闭重新连接请求 至于你那边发心跳,根据实际情况!
现在问题就在于哪边发,如果客户端发是可以,但是服务器不知道原来的那条链是否断开,产生死链。 如果服务器发同理,客户端就不是产生死链这么严重了,就是永远不可能再和服务器脸上 两边都发?然后两边都keepalive?效率?[/quote] 1 如果客户端发, 几次没有接收到服务端的回复,就认为这链路已经坏了,关闭重新链接 服务端一段时间没有接收到心跳包,也认为这链路已经坏了,关闭链路 2 如果服务端发,同理![/quote] 其实我之前就是用的这种办法,但是我没有让他keepalive 结果一段时间过后客户端莫名其妙的不连在服务端上了,也不太好调试原因,是keepalive的原因吗
max_min_ 2013-08-15
  • 打赏
  • 举报
回复
引用 3 楼 yiyefangzhou24 的回复:
[quote=引用 2 楼 max_min_ 的回复:] 对的, 你发心跳包会有回复的,发了几次心跳包没有回复,或者多久没有收到心跳包, 就认为这条链路已经坏掉,需要关闭重新连接请求 至于你那边发心跳,根据实际情况!
现在问题就在于哪边发,如果客户端发是可以,但是服务器不知道原来的那条链是否断开,产生死链。 如果服务器发同理,客户端就不是产生死链这么严重了,就是永远不可能再和服务器脸上 两边都发?然后两边都keepalive?效率?[/quote] 1 如果客户端发, 几次没有接收到服务端的回复,就认为这链路已经坏了,关闭重新链接 服务端一段时间没有接收到心跳包,也认为这链路已经坏了,关闭链路 2 如果服务端发,同理!
yiyefangzhou24 2013-08-15
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
对的, 你发心跳包会有回复的,发了几次心跳包没有回复,或者多久没有收到心跳包, 就认为这条链路已经坏掉,需要关闭重新连接请求 至于你那边发心跳,根据实际情况!
现在问题就在于哪边发,如果客户端发是可以,但是服务器不知道原来的那条链是否断开,产生死链。 如果服务器发同理,客户端就不是产生死链这么严重了,就是永远不可能再和服务器脸上 两边都发?然后两边都keepalive?效率?
max_min_ 2013-08-15
  • 打赏
  • 举报
回复
对的, 你发心跳包会有回复的,发了几次心跳包没有回复,或者多久没有收到心跳包, 就认为这条链路已经坏掉,需要关闭重新连接请求 至于你那边发心跳,根据实际情况!
一叶之舟 2013-08-15
  • 打赏
  • 举报
回复
用心跳包来检测,一段时间没数据就可认为是断线了。
yiyefangzhou24 2013-08-15
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
心跳包是需要一个来回的! 个人意见:任何单通通讯等价于不通。
@zhao4zhong1
yiyefangzhou24 2013-08-15
  • 打赏
  • 举报
回复
引用 10 楼 qq120848369 的回复:
心跳应该依赖超时, 而不应依赖TCP错误, 前者可以检测网络以及进程假死(比如gdb挂住),后者无法处理进程假死.
斑竹大神,您说的在详细一点?我感觉两边都keepalive并且都在应用层收或者发心跳包效率会有很大问题,一个两个链接还好,要是服务端接受一千个链接?他还要费时的分清楚是谁发来的,这效率就底下了
yiyefangzhou24 2013-08-15
  • 打赏
  • 举报
回复
引用 8 楼 lianshaohua 的回复:
不要用keepalive
4、5楼已经说了
qq120848369 2013-08-15
  • 打赏
  • 举报
回复
心跳应该依赖超时, 而不应依赖TCP错误, 前者可以检测网络以及进程假死(比如gdb挂住),后者无法处理进程假死.
woshinia 2013-08-15
  • 打赏
  • 举报
回复
看你是长连接还是短连接了,短连接就用心跳。长连接断开,socket相关函数就会收到一个断开错误。
ztenv 版主 2013-08-15
  • 打赏
  • 举报
回复
不要用keepalive
赵4老师 2013-08-15
  • 打赏
  • 举报
回复
心跳包是需要一个来回的! 个人意见:任何单通通讯等价于不通。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧