关于Boost的Asio的信号灯超时时间已到错误

问题

  最近在测试一个程序的时候,发现过一阵子报了信号灯超时已到错误,ASIO这边的错误码是121。花了点时间,发现了问题所在。

原因

  我自己测了一阵子后发现,大约7分钟左右,就会收到这个错误,此时TCP连接会断开。开始以为腾讯云的问题,接着我添加了心跳…是的,本来只是想看看能不能正常接收,没想到问题就解决了。
  查阅了一些资料,发现根本原因应该是:由于TCP两端在指定时间内未交互数据,所以连接被剔除了。
  但这还不是重点。因为我之前写的很多东西,都是没有心跳的,却能保证几个小时后还能正常通讯,不至于几分钟内连接就挂掉。
  后来,我在StackOverflow找到了一个贴切的答案:

  • If your components:
    * are in a conventional wired network
    * there are no firewalls or NAT routers between them
    * neither of them crash
    * then you do not need to have a heartbeat.
  • If any of these assumptions are false (I am looking at you, GPRS!), a heartbeat becomes necessary rather quickly.

  他的大概意思是:如果是传统的网线直连,中间没有防火墙或者NAT路由的情况下,那么TCP连接是不需要心跳的。
  我这边做的大多是偏向设备的直连,所以就算没有心跳,连接也基本不会出现太大问题。但如果是连到远程服务器,中间就要经过许多路由,在这样的前提下,连接的两端长时间未进行交互,那么连接可能会被剔除。
  不过我之前在查这个错误的时候,有的人是因为一下子Accept太多而报错的,所以,导致这个错误的原因应该也是有很多种的,长时间未交互数据只是我自己这边的一种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值