最近做项目使用到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. Odoo14前端框架常用操作

    单页Web应用(single page web application,SPA): SPA 是一种特殊的 Web 应用,是加载单个 HTML 页面并在用户与应用程序交互时动态更新该页面的. 它将所有的 ...

  2. Mysql索引为什么要采用B+Tree而非B-Tree

       B+树非叶子节点不存储数据只存储索引,B树非叶子节点存储数据.    B+树查询效率更高.B+树使用双向链表串连所有叶子节点,区间查询效率更高(因为所有数据都在B+树的叶子节点,扫描数据库 只需 ...

  3. 「Log」2023.9.26 小记

    序幕 \(\text{6:40}\):到校,整大量博客. 今天有模拟赛,发题的时候就我一个人,差点以为自己要 rk1 了. \(\text{7:30}\):开题. 发现 T1 做过,简单缩点+树直径速 ...

  4. 数据分析必备:GPS轨迹、软件签到、手机信令数据获取方式合集

      本文对目前主要的出租车.公交车.行人GPS轨迹.社交软件签到.手机信令等数据产品的获取网站加以整理与介绍. 目录 6 GPS轨迹与签到数据 6.1 个人GPS轨迹数据 6.1.1 GeoLife ...

  5. 写Leetcode 对业务代码是帮助的

    业务中遇到的表结构以及场景如下: id name pid 1 A 0 2 A 1 3 A 2 4 B 0 5 B 4 6 B 5 7 C 0 8 D 7 9 E 8 是一个层级结构,名字可能相同,也可 ...

  6. .NET Core应用如何通过SSL访问MongoDB?

    大家好,我是Edison. 最近有一个ASP.NET Core通过SSL证书访问MongoDB的需求,但是在网上发现资料很少,于是调查了一番,做了如下的笔记,希望对你有用. 背景 在实际场景中,开发环 ...

  7. Viual Studio 共享组件、工具和SDK的位置不能更改 解决方案

    https://blog.csdn.net/weixin_41923658/article/details/103214742 找到电脑上 VS 的注册表,删除共享组件.工具和 SDK 的注册表:   ...

  8. AB Test基础与Python实战(一):AB test介绍与原理

    目录 AB testing介绍 基本原理 大数定理 中心极限定理 假设检验 零假设与备选假设 显著性水平 拒绝域与单侧双侧检验 单侧检验与双侧检验 P-Value(P值) 样本量的确定 AB test ...

  9. 推荐 5 款实用的 Docker 可视化管理工具,工作效率翻倍!

    前言 经常有小伙伴问:有什么好用的 Docker 可视化管理工具推荐的吗?今天大姚给大家推荐 5 款实用的 Docker 可视化管理工具,选择一款适合自己的 Docker 可视化管理工具能够更方便地查 ...

  10. Codeforces Round #620 (Div. 2) ABC 题解

    A. Two Rabbits 题意:数轴上有x,y,且x<y.x可以每次+a,y可以每次-b.问能否xy相遇. 思路:只要xy差值是a+b的倍数即可. view code #include< ...