sam2022 发表于 2024-1-16 17:55:26

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

本帖最后由 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、


sam2022 发表于 2024-1-16 17:59:14

/* For incoming segments with the ACK flag set, respond with a RST. */
如果是长连接,lwip的这段代码很费解?
当然lwip是没错的,错的是我。

sam2022 发表于 2024-1-16 18:12:19

void tcp_slowtmr(void) 函数中keep-alive相关代码见keep4.png;

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

eric2013 发表于 2024-1-17 09:02:32

这个http的移植实现应该有问题。
这个是我之前TCPnet做的



sam2022 发表于 2024-1-17 14:56:48

站长您好,请教上图5秒更新或者温度定期刷新(https://www.armbbs.cn/forum.php?mod=viewthread&tid=20096&extra=page%3D1)
浏览器每次向开发板数据,是长连接吗?

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

多谢!:L

sam2022 发表于 2024-1-19 12:10:39

请问: 长连接与动态端口有没有关系? 是不是动态端口不能建立长连接?

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

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

eric2013 发表于 2024-1-20 08:59:01

sam2022 发表于 2024-1-19 12:10
请问: 长连接与动态端口有没有关系? 是不是动态端口不能建立长连接?

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

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

默认都是80端口。
页: [1]
查看完整版本: 请教lwip建立http长连接的问题?