socket keepalive 断线重连

yiyefangzhou24 2013-08-15 11:30:11
现在情况如下
客户端在内网,所有的请求只能客户端主动发起,客户端和服务器均采用keepalive保活机制,问题就来了,当有一方的物理链接断开。客户端如何检测到链接已断重新发起连接,而服务器又如何知道连接断开而更新链接列表?
...全文
495 15 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
心跳包是需要一个来回的! 个人意见:任何单通通讯等价于不通。
RS232/RS485串口服务器解决方案 技术特点及应用方式 产品技术特点 供1-16路硬件独立串口(RS232/RS485/TTL)转以太网 支持TCP/IP Server、Client及UDP广播模式,TCP/IP模式下可以跨网段访问 内建支持动态域名服务和Modbus TCP、Modbus RTU双向转换功能 支持双(多)串口服务器透明传输功能。 串口支持流传输及自适应数据帧模式,兼容各种串口应用。 提供VSPM虚拟串口软件。为自适应设计,虚拟串口的参数与串口服务器自动同步,无需 手工设置。同时也支持TCP/IP直连通讯方式。 支持Telnet网管,四口及以上设备提供一个RS232管理口,支持固件刷新。 具备实时线检测、线连、内置看门狗等各类故障恢复机制,并内置管理员口令、 IP认证系统,用于提高网络安全性能。 工业级产品采用磁偶或光电隔离、内置国标电源系统、高等级防护芯片等措施,可在恶 劣环境中稳定运行。 解决方案 串口服务器与电脑上位机应用方式 串口服务器与电脑上位机,用UDP广播实现一对多传输。 串口服务器Sokcet应用方式 串口服务器采用原始数据(RAW Data)传输模式,在与串口服务器建立TCP/IP连接后,就可以直接传输数据。 在使用Socket方式时,请打开TCP/IP的KeepAlive机制,并将检测超时设置为10秒,这样 可以快速检测出网络故障,并做出相应处理。 两个(或多个)串口服务器透明传输 串口服务器A设置为TCP/IP Server模式,串口服务器B设置为TCP/IP Client,并将B的远程服务器地址设置为A的IP地址,这2个串口服务器就可以实现透 明传输。在UDP广播模式下,多个串口服务器的接收端口设置为A的发送端口,A的接 收端口设置为多个串口服务器的发送端口,这样就可以实现串口服务器的单对多透明 传输。 串口服务器与其他嵌入式网络设备联合使用 串口服务器可以与其他嵌入式网络设备联合使用。但是两个设备的工作模式必须匹配。 在串口服务器为Server模式时,其他网络设备必须为Client模式。 串口服务器为Client模式时,其他网络设备必须为Server模式 串口服务器为UDP广播模式时,其他网络设备必须为UDP广播模式。 在与其他网络设备通讯时,建议开启串口服务器的<自适应数据帧>模式,由串口服务器 完成串口数据帧组,用于消除拆包现象。 串口服务器互联网应用-动态域名服务 串口服务器的网关(如ADSL等)为外网动态IP,远程主机也是外网动态IP。这种情 况下,必须申请"动态域名服务"来取得一个固定域名,用于串口服务器解析远程主机IP 地址。 串口服务器根据指定的域名,解析出远程主机的当前IP地址,并主动与主机建立TCP/IP 连接。主机可以在内网或在外网,当主机在内网时,需要在网关上做NAT映射。 串口服务器互联网应用-内网主机 串口服务器可以通过互联网、网关连接到有固定IP内网主机,当主机在内网时,需要在 网关上做NAT映射。 串口服务器工作模式 所有的串口服务器都支持下面这些工作模式,可以通过串口服务器的管理功能配置相应 的工作参数,就可以切换到所需要的模式。 网络工作模式 TCP/IP Server模式 串口服务器监听TCP/IP端口并等待连接,向串口服务器发起连接的可以是电脑或其他 嵌入式网络设备。 TCP/IP Client模式 串口服务器根据设置,向指定的远程主机TCP/IP端口发起连接,这些主机必须工作在 Server模式。 UDP 广播模式 此模式下,串口服务器将用UDP广播方式进行数据通讯,默认设置下,数据将被使用 UDP方式发往广播地址:255.255.255.255:7102,同时串口服务器从地址:255.255. 255.255:7101接收数据,用户也可以根据需要修改这些参数。 此模式可以实现单虚拟串口与多个串口服务器进行通讯的方案。也可以实现一个串口 服务器发送多串口服务器接收的一对多透传方案。 跨网段访问 给串口服务器指定一个有效的网关地址,就可以实现对串口服务器的跨网段访问。T CP/IP Server、Client模式支持跨网段访问。 TCP/IP Server模式 设置串口服务器的网关地址,为有效网关的IP地址。在网关上设置NAT规则,将串口 服务器的IP地址、监听端口映射为网关上的一个TCP/IP端口,向网关上的这个端口发 起连接,就可以与串口服务器建立通讯。 TCP/IP Client模式 设置串口服务器的网关地址,为有效网关的IP地址。并为串口服务器指定要连接的远 程主机地址,如果设置正确,串口服务器就可以通过网关与远程主机建立TCP/IP连接 UDP 广播模式 绝大部分情况下,UDP广播是无法跨网段的。 串口工作模式 流转发模式,

64,666

社区成员

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

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