首页 > 其他分享 >zynq Lwip学习笔记-recv_callback函数

zynq Lwip学习笔记-recv_callback函数

时间:2024-03-23 14:05:07浏览次数:42  
标签:Lwip err tcp callback tpcb zynq TCP OK recv

文章目录


前言

最近在学习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函数调用

标签:Lwip,err,tcp,callback,tpcb,zynq,TCP,OK,recv
From: https://blog.csdn.net/weixin_40356705/article/details/136792309

相关文章

  • zynq Lwip学习笔记-accept_callback函数
    文章目录前言`一、概述二、函数体三、调用关系前言`最近在学习zynq中的lwip协议族,找不到很好的记笔记的地方,所以就用csdn记录一下自己的学习过程。现在对lwip不熟悉,只是把官方的lwipechoserver例程跑了一下,能跑通就一点点的照着学了,笔记都是根据自己的理解写的,而......
  • ZYNQ AXI 片上互联的再思考:AXI GP口/axi lite
    之前笔记:Zynq上的存储器接口与差分时钟与DDR3_zynqddr3-CSDN博客使用AxiLite接口访问寄存器列表作为缓冲区_两个参数共用axilite中一个寄存器-CSDN博客PS与PL互联与SCU以及PG082_pl能不能用ps-gtr-CSDN博客ZYNQ上互联的AXI主要有三种:AXILITEAXIHPAXIACP AXILITE......
  • 使用useCallback包裹后,参数类型就变成了any
    在使用React的useCallbackHook时,如果直接包裹一个函数而没有提供类型参数,TypeScript会默认认为回调函数的参数类型为any。这是因为useCallbackHook接受两个参数,第一个是回调函数,第二个是一个依赖数组,而TypeScript在没有明确指定类型的情况下无法推断回调函数的参数类型。要解决......
  • ZYNQ自定义IP并使用
    目的:自定义一个IP并添加到设计中使用(产生PWM波形)在ZYNQ系统中将许多特定功能的硬件设计模块封装起来称为IP核,类似于库函数。这种方式极大的提高了设计效率。当遇到设计中的一些特殊的需求且官方没有对应的IP时就需要我们自定义IP来使用。 创建步骤:1、创建新IP进入viv......
  • STM32 LwIP学习过程问题总结(一):LwIP ping不通,抓包发现ICMP校验和为0x0000
    一、问题今天在将之前的STM32LwIP1.4.1版本程序移植到2.1.2版本上时,发现ping不同,但是开发板有ICMP回复包,黄颜色警告checksum为0x0000。说明LwIP移植应该是没问题,数据处理这一块出错了。 在网上找了下相关的错误,ST论坛有个问题和我这个一样。HardwareIPv4checksumonanST......
  • ZYNQ7000 PS 复位PL FCLK_RESET0_N
    PSResetPLPS可以输出4个独立的复位信号给PL,用于控制PL逻辑的复位。如何控制呢?参考https://support.xilinx.com/s/question/0D52E00006hpUDcSAM/asserting-fclkreset0n-fpgarstctrl-from-baremetal-system?language=en_US裸机代码如下://assertFPGAResetSignal#d......
  • Blazor笔记-Component EventCallback
    更新记录注意:非教程。纯笔记,日常查询用的。需要教程的小伙伴找几本书看看即可哈哈,有Vue基础的话非常快,概念都是通的。非工作需要不建议深入学习Blazor,深入Vue吧,用的多,哈哈。完整目录地址:https://www.cnblogs.com/cqpanda/p/17596348.html点击查看2024年3月7日发布。2023......
  • LWIP RAW接口TCP与UDP部分函数解析
    RAWTCP接口tcp_input()函数voidtcp_input(structpbuf*p,structnetif*inp) --->staticerr_ttcp_process(structtcp_pcb*pcb) --->staticvoidtcp_receive(structtcp_pcb*pcb) --->>TCP_EVENT_RECV(pcb,recv_data,ERR_OK,err);//调用用户注册......
  • react-native中memo、useMemo、useCallback 你真的用明白了吗
    memo的作用在React的渲染流程中,一般来说,父组件的某个状态发生改变,那么父组件会重新渲染,父组件所使用的所有子组件,都会强制渲染。而在某些场景中,子组件并没有使用父组件传入的没有发生更改的状态时,子组件重新渲染是没有必要的。因此有了React.memomemo的使用memo是个高阶......
  • 钩子hook,回调函数callback
    摘自和参考如下资料:钩子(回调函数)与PyTorch-知乎(zhihu.com) 把钩子函数传递给触发函数,就可以在触发函数内调用钩子函数了。其实就是把函数指针或者函数名传给另一个函数。只不过一般不单独这么用,配合类一起用可能就稍微麻烦了点。classOneday():def__init__(se......