zynq Lwip学习笔记-recv_callback函数


前言

最近在学习zynq中的lwip协议族,找不到很好的记笔记的地方,所以就用csdn记录一下自己的学习过程。现在对lwip不熟悉,只是把官方的lwip echo server例程跑了一下,能跑通就一点点的照着学了,笔记都是根据自己的理解写的,而且部分内容可能也只针对lwip echo server例程有效,笔记可以供有缘人参考,但不敢保证全对,有不对的地方也期待有高人指点一二。

一、概述

  • 原型
    err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
  • 参数
    1:arg 是在建立连接时传递给回调函数的参数,通常用于指向应用程序的上下文或状态。
    2:tpcb 是当前 TCP 连接的 PCB(协议控制块)指针。
    3:p 是接收到的数据包,它是一个 pbuf 结构体链表。
    4:err 表示接收操作的状态,ERR_OK 表示成功,其他值表示错误。
  • 功能
    接收一个数据包并原样发回

二、函数体

err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    /* do not read the packet if we are not in ESTABLISHED state */
    /* 注意:这里的代码并没有检查TCP状态,这只是一个注释。要真正实现这个注释的内容,需要添加状态检查代码 */
    if (!p) {
        /* 如果没有数据包(p为NULL),关闭TCP连接 */
        tcp_close(tpcb);
        /* 通知TCP层没有数据包要处理 */
        tcp_recv(tpcb, NULL);
        /* 返回OK,尽管这里发生了异常情况 */
        return ERR_OK;
    }

    /* 通知TCP层已经接收了p->len长度的数据 */
    tcp_recved(tpcb, p->len);

    /* 将负载数据回显回去(即发送回去) */
    /* 假设负载数据大小小于TCP发送缓冲区大小 */
    if (tcp_sndbuf(tpcb) > p->len) {
        /* 如果有足够的空间在TCP发送缓冲区中,就写入数据 */
        err = tcp_write(tpcb, p->payload, p->len, 1);//该函数为tcp发送函数
    } else {
        /* 如果没有足够的空间,则打印错误信息 */
        xil_printf("no space in tcp_sndbuf\n\r");
    }

    /* 释放接收到的pbuf */
    pbuf_free(p);

    /* 返回OK */
    return ERR_OK;
}

三 调用位置

通过tcp_recv函数调用

相关推荐

  1. python学习笔记——函数

    2024-03-23 15:08:01       35 阅读
  2. zynq Lwip学习笔记-recv_callback函数

    2024-03-23 15:08:01       41 阅读
  3. 菜鸟笔记-15arange函数学习

    2024-03-23 15:08:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 15:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 15:08:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 15:08:01       82 阅读
  4. Python语言-面向对象

    2024-03-23 15:08:01       91 阅读

热门阅读

  1. 大数据的实时计算和离线计算你理解吗?

    2024-03-23 15:08:01       39 阅读
  2. 应用日志集成到ElasticSearch

    2024-03-23 15:08:01       37 阅读
  3. 防火墙(讲解)

    2024-03-23 15:08:01       42 阅读
  4. 设计模式: 外观模式

    2024-03-23 15:08:01       42 阅读
  5. 网络通信过程中为什么需要连接池?

    2024-03-23 15:08:01       38 阅读
  6. Vue-live2d在项目中展示Live2D 模型

    2024-03-23 15:08:01       42 阅读
  7. odoo字段访问控制

    2024-03-23 15:08:01       39 阅读
  8. VUE父子组件的传参问题

    2024-03-23 15:08:01       44 阅读
  9. 5 数据分析——matplotlib

    2024-03-23 15:08:01       36 阅读
  10. 【Qt5】QVariant

    2024-03-23 15:08:01       36 阅读
  11. 渔夫码头密语: 记录使用 Docker 安装 Wordpress

    2024-03-23 15:08:01       45 阅读
  12. ARP攻击是什么

    2024-03-23 15:08:01       45 阅读