Arm2048 发表于 2024-1-4 12:15:08

请教lwip Raw中keepalive的问题

本帖最后由 Arm2048 于 2024-1-4 12:18 编辑

前提:ip=71的是电脑浏览器,ip=44的是STM32主板webserver; 因为STM32主板没有操作系统,只能用Raw接口函数;
          lwip保活KeepAlive设置: opt.h中:#define LWIP_TCP_KEEPALIVE            1
         /* create new tcp pcb */
              webpcb = tcp_new();
              if (webpcb != NULL) {
                   err_t err;
        #if 1       
                webpcb->so_options |= SOF_KEEPALIVE;
                //webpcb->keep_idle=5000; //ms
                webpcb->keep_intvl=5000; //ms
                webpcb->keep_cnt=12; //report error after 12
        #endif
                ............

问题:运行一会儿后,电脑向主板发送,主板无应答,应该有TCP Keep-Alive ACK才对;从11:01:06秒到11:08:11秒都无应答,电脑向主板发送后又激活连接;
1050:71浏览器向44主板请求dios.html;
1051:   44主板向浏览器发送diso.html;
1055:   71浏览器应答1051序号包;
然后从1555开始后面就奇怪了,71浏览器不知为什么发送了两次,这是是关闭连接了吗???
求分析解惑,多谢!



Arm2048 发表于 2024-1-4 12:21:45

先看图片keep1是发生问题;
再看图片keep2是自动恢复;

Arm2048 发表于 2024-1-4 15:01:22

很奇怪,这种TCP Keep-Alive无应答断开连接的情况,每次都持续6分钟55秒后,被电脑端发送重新恢复;
然后正常工作10秒,再次断掉....如此重复......

在STM32主板上打开/关闭LWIP_TCP_KEEPALIVE ,现象都一样。

wye11083 发表于 2024-1-4 18:00:55

?http协议不是长连接协议。tcp传输完毕之后必须中止。

Arm2048 发表于 2024-1-5 09:56:26

本帖最后由 Arm2048 于 2024-1-5 09:58 编辑

stm32发送给浏览器的主网页html中包含javascript脚本,是ajax功能周期发送GET请求,STM32应答数据用来动态刷新网页局部数据;

如果我把ajax功能脚本注释掉不让其运行,虽然STM32也不应答电脑浏览器每隔45秒发送的KeepAlive,主网页长时间运行良好,提交的GET请求STM32都能收到并能正确应答;
如果开启ajax功能javascript脚本,登录进入主页面html后,STM32只能接收到5次电脑浏览器发送的ajax功能GET请求,以后的请求(ajax脚本请求或者网页其它提交请教)STM32都接收不到,wireshark抓包就是keep1.png的那种无应答;

昨天有一次,无ajax功能脚本的情况下,STM32服务器端对浏览器发送的y应答良好,每次应答,但很后面重启后再也无法复现这种正常情况了。
页: [1]
查看完整版本: 请教lwip Raw中keepalive的问题