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函数调用

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值