OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6541|回复: 7

浅谈LWIP之pbuf链表数据接收问题

[复制链接]

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
发表于 2017-7-8 11:41:55 | 显示全部楼层 |阅读模式
本帖最后由 FreeRTOS 于 2017-7-8 11:41 编辑

这几天忙里偷闲又研究了LWIP的包缓冲区pbuf,发现一个一直使用的数据接收的错误,具体是在接收回调函数里简单粗暴的直接使用拷贝语句来复制数据包内容:
image001.png
因为公司的机子一直没有碰到数据包比较大的情况,所以一直没发现上面的接收代码有问题,
直到昨天才想起pbuf是采用链表式内存来保存网络数据的,当数据包长度大于一定值时,问题就出现了。
以发送0x00~0x4F的80字节为例:
image003.png

LWIP在UDP回调函数里的pbuf链表指针p的tot_len为80,但len字段只有78,意味着80字节的数据不能被一个pbuf保存完
image005.png

image007.png

这时如果直接采用memcpy来拷贝的话,最后的2字节无疑是错误的!下面给出了数据读取后数组最后2字节的错误内容:
image009.png
image011.png



再深入分析下这个问题,由于LWIP的数据接收采用的是pbuf链表,当数据包比较大时,可以认为LWIP将数据包分块然后连成一个链表,
最后LWIP把这个链表的链表头传递到回调函数,这时用户如果想获取这个链表的内容,就必须读取链表的每个payload才能确保数据正确!
下面贴上本渣自己写的代码:
image013.png

当调用上面的函数接收后,接收数据正确了:
image015.png
image017.png




上面的实验只是试验了数据包没有超出缓冲区的情况,下面以512字节来试验缓冲区大小为256的情况:
image019.png

进入到Get_PBUF_Payload()函数后可以看到当前的pbuf链表总长度为512:
image021.png
image023.png

由于传递进来的maxLen = 256,因此函数返回的成功读取的数据也是256而非512!
image025.png

image027.png



后来翻了下原子F7的例程,思路跟本渣的大致一样,不过原子兄的这个代码无法获取实际读取的数据长度:
image029.png



更多LWIP的pbuf知识请读者自行查阅《Design and Implementation of the lwIPTCP_IP Stack》,当然本渣是不会告诉你这本资料有中文翻译版本的。
最后推荐下五木大神关于LWIP的见解《LwIP协议栈源码详解》,资料问度娘。


浅谈LWIP之pbuf链表数据接收问题.pdf

229.26 KB, 下载次数: 481

拿来长岛冰茶换我半晚安睡
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

465

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2142
金钱
2142
注册时间
2013-1-11
在线时间
504 小时
发表于 2017-7-13 15:34:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2017-7-14 11:59:54 | 显示全部楼层

谢谢关注!
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2017-7-14 14:00:43 | 显示全部楼层
支持一个,LWIP和FreeRTOS这种作者写起来爽,其他人看没那么清晰
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
 楼主| 发表于 2017-7-14 16:15:16 | 显示全部楼层
shibusha 发表于 2017-7-14 14:00
支持一个,LWIP和FreeRTOS这种作者写起来爽,其他人看没那么清晰

虽然没太明白你的意思,不过还是感谢支持!
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2017-7-16
在线时间
1 小时
发表于 2017-7-16 19:10:42 | 显示全部楼层
有发现,有改进,有受益,灰常感谢
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2014-1-11
在线时间
95 小时
发表于 2017-7-22 11:03:12 | 显示全部楼层
虽然不知道在说什么,不过直接膜拜就对了。
回复 支持 反对

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-8-25
在线时间
25 小时
发表于 2020-10-23 10:17:15 | 显示全部楼层
楼主分享的很有用!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表