基于LWIP的嵌入式TCP服务端是否可使用Keepalive功能?
LWIP TCP服务端Keepalive功能使用说明
TCP Keepalive是TCP协议规范定义的原生能力,服务端、客户端两侧均可独立启用,不存在仅支持客户端使用的限制,你在嵌入式TCP服务端侧开启该功能检测客户端异常断连是完全可行的。
LWIP启用服务端Keepalive的配置步骤
- 第一步需要在LWIP的配置头文件
lwipopts.h中开启功能总开关:#define LWIP_TCP_KEEPALIVE 1 - 你可以根据需求选择全局配置或单连接定制配置两类参数设置方式:
- 全局默认参数(在
lwipopts.h中修改,对所有开启keepalive的TCP连接生效):TCP_KEEPIDLE_DEFAULT:连接无数据交互的空闲时长阈值,达到阈值后开始发送keepalive探测包,单位为毫秒,默认值通常为7200000(即2小时)TCP_KEEPINTVL_DEFAULT:两次探测包的发送间隔,单位为毫秒,默认值通常为75000(即75秒)TCP_KEEPCNT_DEFAULT:连续无响应的探测次数阈值,达到阈值后判定连接异常,默认值通常为9次
- 单连接定制配置:可通过
setsockopt()接口单独为服务端监听产生的每个连接设置SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT选项,也可调用LWIP原生接口tcp_keepalive_enable()启用,适合不同业务属性的连接使用不同的探测规则。
- 全局默认参数(在
嵌入式场景使用建议
- 默认的全局参数探测周期过长,建议根据业务可接受的断连感知延迟调整参数,比如设置为空闲30秒开始探测、探测间隔5秒、连续3次无响应判定断连,即可在45秒左右感知到客户端异常断连。
- 连接判定异常后LWIP会自动关闭对应连接,你可以在TCP错误回调中通过
ERR_ABRT状态码感知该事件,及时清理连接对应的业务资源即可。
内容的提问来源于stack exchange,提问作者Lamastaga
相关产品推荐
相关产品推荐

