文章转自老衲五木的新浪博客
保活功能是TCP很重要的一个特性,它在连接异常检测,异常处理上起着至关重要的作用。一个网络应用程序是否稳定可靠,连接的异常处理尤为重要。很多人反应,LwIP做客户端时,是不是很不稳定,经常会莫名掉线。老衲想说的是,应为网络,硬件,环境等等太多原因,掉线是正常的,你应该把它看作一种常态,你对连接异常的处理有哪些,处理的怎么样,这些决定了你的代码的稳定性和可用性。
1),如果你程序做的是服务器,那这种情况比较简单,内核已经对每个连接默认开启了保活功能,当连接异常时,内核会通知你一个err的回调。
2),如果你程序做的是客户端,这种情况下比较麻烦,内核没有默认给你打开保活功能,此时需要自己动手啦,通常在建立连接的时候这样做即可:
#define LWIP_TCP_KEEPALIVE 1 //开启用户自定义保活时间,这个值如果为0,则系统使用默认的保活时间参数(这些参数可能不是你想要的,比如内核默认在连接双方都没有数据交互2个小时后,再发送保活探测包,对于拔网线这种异常,2小时太久了,用户期望能在越短的时间内检测出异常越好)
#define TCP_KEEPIDLE_DEFAULT 60000 //60秒内连接双方都无数据,则发起保活探测(该值默认为2小时)
#define TCP_KEEPINTVL_DEFAULT 10000 //每10秒发送一次保活探测
#define TCP_KEEPCNT_DEFAULT 9 //一共发送9次保活探测包,如果这9个包对方均无回应,则表示连接异常,内核关闭连接,并发送err回调到用户程序