LWIP TCP滑动窗口为TCP ZeroWindow的解决方法

最近做项目使用到LWIP, 板子当作客户端,PC机当作服务器,当板子和PC机通信一段时间后,板子就接收不到数据。抓包分析为:

发现经过一段时间通信后,滑动窗口大小越来越小,最终显示为TCP WINDOW FULL,TCP ZeroWindow。 仔细分析了下LWIP源码,还以为是内存管理出了问题,跟踪了半天memp.c也没发现问题。后来发现问题出现自己的应用实现代码,下面是我这边的实现代码:

复制代码
err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    if (err != ERR_OK) {
        RLOG_ERROR("Error in tcp_client_recv: %d\n", err);
        tcp_client_close(tpcb); // 关闭连接
        return ERR_OK; // 释放 pbuf
    }

    if (p != NULL) {
        // 处理接收到的数据
        char *data = (char *)p->payload;
        int datalen = p->len;

        // 安全地复制数据
        char buff[datalen + 1];
        memcpy(buff, data, datalen);
        buff[datalen] = '\0';

        // 打印接收到的数据
        //RLOG_INFO("Received data: %s\n", buff);

        // 释放 pbuf
        pbuf_free(p);
        RLOG_INFO("pbuf freed\n");
    }
    tcp_output(tpcb);

    return ERR_OK;
}

上面的代码,需要在接受数据后,主动调用tcp_recved(tpcb, p->tot_len) ,修改代码后,再次验证功能正常。

修改后的代码:

复制代码
err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    if (err != ERR_OK) {
        RLOG_ERROR("Error in tcp_client_recv: %d\n", err);
        tcp_client_close(tpcb); // 关闭连接
        return ERR_OK; // 释放 pbuf
    }

    if (p != NULL) {
        // 处理接收到的数据
        char *data = (char *)p->payload;
        int datalen = p->len;

        // 安全地复制数据
        char buff[datalen + 1];
        memcpy(buff, data, datalen);
        buff[datalen] = '\0';

        // 打印接收到的数据
        //RLOG_INFO("Received data: %s\n", buff);
		
	tcp_recved(tpcb, p->tot_len);
        // 释放 pbuf
        pbuf_free(p);
        RLOG_INFO("pbuf freed\n");
    }
    tcp_output(tpcb);

    return ERR_OK;
}

原来,tcp_recved(tpcb, p->tot_len) 的主要作用是通知 TCP 层应用程序已经处理了指定长度的数据。这有助于 TCP 层调整接收窗口,避免接收缓冲区溢出,并确保数据传输的高效性。如果忘记调用这个函数,可能会导致接收窗口过小,影响数据传输效率。

相关推荐
奔跑吧邓邓子6 天前
【C++实战(62)】从0到1:C++打造TCP网络通信实战指南
c++·tcp/ip·实战·tcp·网络通信
DIY机器人工房12 天前
关于解决 libwebsockets 库编译时遇到的问题的方法:
服务器·stm32·单片机·嵌入式硬件·tcp
蒋星熠15 天前
网络协议深度解析:从OSI七层模型到现代互联网通信的技术实战
网络·后端·python·网络协议·http·性能优化·tcp
章咸鱼121381 个月前
nios simple soket tcp在面对arp洪流时崩溃的处理
fpga开发·tcp
XMZH030421 个月前
网络编程;TCP多进程并发服务器;TCP多线程并发服务器;TCP网络聊天室和UDP网络聊天室;后面两个还没写出来;0911
服务器·网络·tcp/ip·udp·tcp
凉伊1 个月前
TCP协议核心机制详解:握手、挥手、可靠传输与拥塞控制
网络·网络协议·tcp
吐个泡泡v1 个月前
网络编程基础:一文搞懂 Socket、HTTP、HTTPS、TCP/IP、SSL 的关系
网络·网络协议·http·https·socket·ssl·tcp
几度春风里1 个月前
LwIP入门实战 — 3 LwIP的网络接口管理
lwip
code bean1 个月前
SuperSocket 动态协议服务端开发全解析
tcp
hy.z_7771 个月前
【JavaEE】网络编程套接字2: TCP流 套接字编程
网络·java-ee·tcp