lwip packet buffer管理API函数应用总结

看来学习也是一种坚持,本来昨天打算写的,可是太晚了一懒就拖到今天了。今天动笔想必也是会忘了很多。

 

1、lwip 的 pbuf 是数据链,它的首位没有相连,如果,你在头一个pbuf里面想要寻到下一个pbuf那么直接找寻p->next.如果要找下一个的下一个呢?可以用p->next->next。

至于p->ref是什么作用,相关文档上面说,当ref=0的时候,pbuf就自动解除掉。

 

2、相关文档上面说,pbuf可以申请RAM,ROM和POOL三种类型的pbuf。我申请过RAM和ROM的,但是,当我申请POOL类型的时候,我把我要发送数据的指针指过去p->payload的时候,发现程序是出错的。具体原因,我还不清楚,但是网上有一句话,就是POOL类型的PBUF经常用来接受数据包,而且,经常用在底层驱动程序或者中断程序这些要求分配快速得地方。(如果知道里面为什么出错的原因的朋友,欢迎交流交流)

我发现申请RAM类型的pbuf,然后,把它连接成链的时候,它是把RAM复制过去。成链之后还可以pbuf_free原来你alloc的pbuf。

3关于函数说明:

3.1    pbuf_alloc,该函数顾名思义就是分配一个pbuf

3.2    pbuf_realloc,这个函数很诡异,它的函数说明的意思说,可以把一条pbuf链里面的最后一个pbuf的大小缩小成你设定的长度,其它的pbuf将会消失掉。

但是,我在别人翻译的document上面看到,它说是重新把你填进去的那个pbuf缩小到你设定的长度。

然后,我用了多种方法,在程序中试验,都发现,这两种说法都不正确。(这里知道的朋友,也欢迎跟我交流交流)

3.3   pbuf_header,这个函数很好,就是重新分配p->payload指针,和增长新的pbuf的长度

3.4   pbuf_free,free掉ram里面的pbuf结构,如果pbuf->type是RAM类型的话,就连数据也一起free掉

3.5   pbuf_clen,计算pbuf链当中的pbuf个数

3.6   pbuf_ref,增加pbuf->ref这个数,但是具体ref有什么作用暂时还不清楚

3.7   pbuf_cat,把两个pbuf链成链。然后,把第二个参数的pbuf,自动free掉

3.8   pbuf_chain,作用同上面,但是第二个pbuf没有free

3.9   pbuf_dechain,解开pbuf链中的第一个pbuf

3.10 pbuf_copy(struct pbuf *p_to, struct pbuf *p_from),这个函数,就是把from这个pbuf拷贝到to这个pbuf注意,to这个pbuf应该比from这个空间要大。注意这里面的拷贝,就是全部拷贝了。拷贝后原来to这个pbuf所有数据都会清除

3.11 pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)这里面就是部分拷贝外部数据到pbuf。这里面就没有把pbuf格式化掉了,只是将部分数据替换了而已

3.12 pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)这个就是拷贝数据到pbuf了,没有偏移而已。

3.13 pbuf_coalesce(struct pbuf *p, pbuf_layer layer)创建一个队列外的pbuf,具体怎么用,还不知道。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您的问题是关于lwIP Raw API中创建TCP服务器并使用函数tcp_recved的使用方法。 首先,使用lwIP Raw API创建TCP服务器需要调用函数tcp_new()创建一个tcp_pcb结构体,并设置回调函数来处理TCP连接的各种事件。例如,下面是一个简单的示例代码片段: ``` struct tcp_pcb *tcp_server_pcb; tcp_server_pcb = tcp_new(); tcp_bind(tcp_server_pcb, IP_ADDR_ANY, YOUR_PORT); tcp_server_pcb = tcp_listen(tcp_server_pcb); tcp_accept(tcp_server_pcb, tcp_server_accept_callback); ``` 在上述示例中,tcp_new()函数创建了一个新的tcp_pcb结构体,并将其绑定到本地IP地址和端口号。然后,tcp_listen()函数将其设置为监听状态,等待客户端连接。最后,tcp_accept()函数将一个回调函数tcp_server_accept_callback()设置为处理新连接的回调函数。 一旦有客户端连接,回调函数tcp_server_accept_callback()将被调用。在这个回调函数中,您可以使用tcp_recved()函数来处理接收到的数据。例如,下面是一个简单的示例代码片段: ``` void tcp_server_accept_callback(void *arg, struct tcp_pcb *newpcb, err_t err) { char *data = "Hello, world!"; tcp_write(newpcb, data, strlen(data), TCP_WRITE_FLAG_COPY); tcp_recv(newpcb, tcp_server_recv_callback); return ERR_OK; } void tcp_server_recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { if (p != NULL) { tcp_recved(tpcb, p->tot_len); } return ERR_OK; } ``` 在上述示例中,tcp_server_accept_callback()函数被调用来处理新连接。首先,它向客户端发送一个“Hello, world!”消息。然后,它使用tcp_recv()函数来设置一个回调函数tcp_server_recv_callback(),用于处理接收到的数据。在tcp_server_recv_callback()函数中,我们可以使用tcp_recved()函数来处理接收到的数据。 总之,tcp_recved()函数用于通知lwIP堆栈接收到了一些数据。它的参数是接收到的数据的总长度。您需要在回调函数中使用tcp_recved()函数来处理接收到的数据,并通知堆栈接收到了多少数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值