问题
最近在测试一个程序的时候,发现过一阵子报了信号灯超时已到
错误,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太多而报错的,所以,导致这个错误的原因应该也是有很多种的,长时间未交互数据只是我自己这边的一种情况。