野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17370|回复: 1

请问lwip如何实现http长连接

[复制链接]
发表于 2020-10-24 09:59:54 | 显示全部楼层 |阅读模式
现在用的是lwip的netconn API(配合freertos),想要在STM32F429上搭建HTTP服务器。整个工程是在AP6181例程上进行修改的
伪代码如下:

创建、绑定、监听等等。。
while(1){
netconn_recv(conn, &inbuf)根据url返回一些数据(netconn_write)
netbuf_delete(inbuf);
}

web资源都存在stm32中,连接上wifi后在浏览器上输入指定ip返回页面,加载完成后前端js脚本每一秒发送一次http请求,大部分响应可以在50ms左右返回,但始终有少部分的响应包需要好几秒才能返回,抓包看了之后,每次http请求都要先进行tcp握手挥手,比较影响效率,所以想改成长连接。看了lwip的httpd.c的一小部分源码,开启宏定义LWIP_HTTPD_SUPPORT_11_KEEPALIVE,里面在解析http请求头部含有keep-alive时,将hs->keepalive置1,然后在响应包发送完成后调用http_eof,这个函数里面因为hs->keepalive为1,所以就不关闭连接(httpd.c中该函数的源码见下图)。所以后来试了一下在死循环里一直阻塞接收数据包,完成netconn_write后不去调用netconn_close(conn),并且在返回的响应包里加了connection:keep-alive和content-length头部,但是看了抓包结果后发现发送完第一次http请求后接下来的http请求还是会有tcp的握手挥手,和正常recv--->write--->close流程不同的是STM32在响应前两个http请求后就卡住不再有动作,抓包结果见下图(192.168.1.100是pc的ip,200是stm32的ip,红线以上是从开始到卡住不动之间的过程,红线以下是关闭浏览器后的过程)。麻烦各位看看我的理解有哪些问题以及如何修正。

httpd.c

httpd.c

抓包结果

抓包结果



回复

使用道具 举报

 楼主| 发表于 2020-10-27 16:58:26 | 显示全部楼层
有人可以解答一下吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-24 17:47 , Processed in 0.047463 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表