硬汉嵌入式论坛

 找回密码
 立即注册
查看: 521|回复: 6
收起左侧

[LwIP] 请教lwip建立http长连接的问题?

[复制链接]

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2024-1-16 17:55:26 | 显示全部楼层 |阅读模式
本帖最后由 sam2022 于 2024-1-16 18:08 编辑

前提 :  STM32F4上lwip RAW做了个webserver,电脑浏览器做客户端显示网页与数据; 网页脚本有周期定时向STM32发送请求数据,STM32应答数据包,浏览器动态刷新显示数据;


问题: 浏览器周期定时请求都要握手,能不能是长连接?请大佬指点迷津,多谢!

1、浏览器网页内容显示后,有些参数可以修改,然后提交给STM32; 如果只是提交数据,无论间隔多长时间提交数据,STM32F4都能接收到,都能成功,这是长连接;
2、如果网页脚本周期定时发起POST请求,STM32成功应答5、6次收不到请求了(浏览器还在发送请求);估计是连接已经挂掉了;虽然STM32有配置keep-alive,但没应答浏览器的keep-alive;
3、static void
tcp_listen_input(struct tcp_pcb_listen *pcb)
{
  struct tcp_pcb *npcb;
  u32_t iss;
  err_t rc;

  if (flags & TCP_RST) {
    /* An incoming RST should be ignored. Return. */
    return;
  }

  LWIP_ASSERT("tcp_listen_input: invalid pcb", pcb != NULL);

  /* In the LISTEN state, we check for incoming SYN segments,
     creates a new PCB, and responds with a SYN|ACK. */
  if (flags & TCP_ACK) {
    /* For incoming segments with the ACK flag set, respond with a
       RST. */
    LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
    tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
            ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  } else if (flags & TCP_SYN) {
    LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest));
=====================================
为什么listen在接收到ACK应答后,要发送RST? 这不是断开连接吗?
4、


http long.png

keep4

keep4

keep3

keep3
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-1-16 17:59:14 | 显示全部楼层
/* For incoming segments with the ACK flag set, respond with a RST. */
如果是长连接,lwip的这段代码很费解?  
当然lwip是没错的,错的是我。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-1-16 18:12:19 | 显示全部楼层
void tcp_slowtmr(void) 函数中keep-alive相关代码见keep4.png;

配置keep-alive后,结果见keep3.png:浏览器狂发keep-alive,1秒内能发2次; 没有抓取到周期定时请求(可能连接已经挂了)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-1-17 09:02:32 | 显示全部楼层
这个http的移植实现应该有问题。
这个是我之前TCPnet做的


124.png
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-1-17 14:56:48 | 显示全部楼层
站长您好,请教上图5秒更新或者温度定期刷新(https://www.armbbs.cn/forum.php? ... &extra=page%3D1)
浏览器每次向开发板数据,是长连接吗?

我这边: 浏览器向开发板POST请求--->开发板给浏览器发送数据包-->浏览器收到后应答ACK--->开发板收到ACK后发送[RST,ACK]断开连接;
下个周期浏览器向开发板POST请求数据时,要重新与开发板3次握手,再请求;
这样也能工作,但我看看能不能做成长连接,避免浏览器每次请求都先3次握手,开发板应答数据包后断开连接;

多谢!
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-1-19 12:10:39 | 显示全部楼层
请问: 长连接与动态端口有没有关系? 是不是动态端口不能建立长连接?

chrome/chromium浏览器每次都会更换一个端口号发送POST请求,所用端口号是电脑win10的动态端口范围内递增;STM32服务器监听端口号当然是80不变;
比如这次浏览器POST请求发送端口号是50000,下一次浏览器POST请求发送端口号是50002;因为STM32服务器应答了50000端口后不会再收到数据了,就主动发送[RST,ACK]结束掉连接?
我试过加长keep-alive时间参数,浏览器发送3次POST后(30秒),STM32会集中一次连续发送3条[RST,ACK]断开3次POST请求的连接。

我搜过内外网,没有找到长连接与动态端口号的关系的内容。以上只是我实测+猜测。 POST是应用层,动态端口号是通信层,确实很费解

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-1-20 08:59:01 | 显示全部楼层
sam2022 发表于 2024-1-19 12:10
请问: 长连接与动态端口有没有关系? 是不是动态端口不能建立长连接?

chrome/chromium浏览器每次都会 ...

默认情况下,非80端口,都要网址后面指定端口号才可以打开。

默认都是80端口。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 15:50 , Processed in 0.195544 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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