最近做项目使用到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 层调整接收窗口,避免接收缓冲区溢出,并确保数据传输的高效性。如果忘记调用这个函数,可能会导致接收窗口过小,影响数据传输效率。

LWIP TCP滑动窗口为TCP ZeroWindow的解决方法的更多相关文章

  1. 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解

    第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...

  2. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

  3. TCP 滑动窗口和 拥塞窗口

    转http://coolshell.cn/articles/11609.html 滑动窗口 -- 表征发送端和接收端的接收能力 拥塞窗口-- 表征中间设备的传输能力 TCP滑动窗口 需要说明一下,如果 ...

  4. TCP 滑动窗口的简介

    TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可 ...

  5. TCP滑动窗口控制流量的原理

    TCP的滑动窗口机制       TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的传输协议就需要对数据进行确认.TCP协议里窗口机制有2种:一种是固定的窗口大小 ...

  6. tcp滑动窗口详解(2)

    http://blog.csdn.net/yujun00/article/details/636495 ARQ与滑动窗口概念  滑动窗口协议,是TCP使用的一种流量控制方法.该协议允许发送方在停止并等 ...

  7. [转]TCP滑动窗口详解

    TCP滑动窗口详解  http://lyjdamzwf.blog.163.com/blog/static/75206837201193373226/ TCP滑动窗口(Sliding Window)   ...

  8. TCP滑动窗口协议

    TCP的首部中​有一个很重要的字段就是16位长的窗口大小,它出现在每一个TCP数据报中,配合32位的确认序号,用于向对端通告本地socket的接收窗口大小.也就是说,如果本地socket发送一个TCP ...

  9. TCP滑动窗口与回退N针协议

    [转]TCP 滑动窗口协议/1比特滑动窗口协议/后退n协议/选择重传协议 2014-1-5阅读884 评论0 本文转自 http://www.cnblogs.com/ulihj/archive/201 ...

  10. TCP滑动窗口(发送窗口和接受窗口)

    TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...

随机推荐

  1. JAVA的那些数据结构实现总结,实现,扩容说明

    能沉淀下来的东西,往往都很基础,整理了下JAVA中遇到的数据结构 目录大纲: 到目前接触到的 有几个说明: 可扩容数组 ArrayList 扩容数组的实现, 满了后扩容,扩容在1.5倍,通过copy过 ...

  2. SQL注入之字符型和数字型注入

    SQL注入之数字型注入和字符性注入: 数字型注入:不需要闭合 字符型注入:需要闭合 如何判断属于那种注入? 1.用减法判断:利用id=2-1 如果返回的是id=1的结果,则是数字注入,否则是字符注入 ...

  3. 面试题:String,StringBuilder,StringBuffer三者的区别

    摘要:总结Java中的String,StringBuilder,StringBuffer三者的区别和联系,介绍后两者的扩容机制.   Java中的String,StringBuilder,String ...

  4. Java集合--LinkedList源码可视化

    集合节点保存的都是对象的引用,而非具体值,文中案例仅仅为了方便实现原理的演示. 1. 底层数据结构 LinkedList 基于 双向链表 实现,内部通过 Node<E> 节点相互连接: p ...

  5. upload-labs靶场通关教程

    upload-labs靶场通关教程 Pass-01 我们先上传带有一句话木马的1.php 查看页面源代码发现是前端js弹窗,我们直接禁用前端即可. 再进行上传1.php,我们就可以上传了. Pass- ...

  6. 超赞!本地程序调用云知识库实现RAG功能

    在 Spring AI Alibaba 程序中,我们可以直接使用本地程序调用百炼平台的云知识库,实现知识库文档解析.分块.向量化存储等一条龙服务. 这样,开发者就不用本地部署搭建向量数据库.不用进行复 ...

  7. 鸿蒙Next仓颉开发语言中的数据类型总结分享

    大家好,今天总结一下仓颉中的数据类型. 数字 仓颉中的数字类型复杂多样,首先分为整型和浮点型两种,也就是Int类型和Float类型,Int类型有Int.Int8.Int32.Int64几种类型,Flo ...

  8. ET框架服务端部署到Linux

    运行环境:Centos7.3 + JetBrains Rider 2020 + ET 5.0 + Mac笔记本 (这里要说一下低于Centos7的没法安装.net core环境) 服务器和资源服务部署 ...

  9. Linux百度网盘优化三板斧

    解决Linux百度网盘CPU占用过高,下载进度卡住,频繁崩溃退出问题. 解决Linux百度网盘CPU占用过高问题 夏天到了,百度网盘下载时conky显示CPU温度飙升到99摄氏度,风扇嗷嗷叫,但CPU ...

  10. SQL server跨库链接服务器

    SQL server进阶技能篇:SQL的跨库查询与链接服务器 - 知乎 (zhihu.com)各位小伙伴们,关于MSSQL的基本技能篇前面一共写了10篇,也基本上算是告一段落,接下来将开始介绍进阶技能 ...