文章目录
前言
最近在学习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