🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
pbuf就是一个描述协议栈中数据包的数据结构,LwIP中在pbuf.c和pubf.h实现了协议栈数据包管理的所有函数与数据结构,pbuf数据结构的定义具体见: ``` 1 /** Main packet buffer struct */ 2 struct pbuf 3 { 4 /** next pbuf in singly linked pbuf chain */ 5 struct pbuf *next; (1) 6 7 /** pointer to the actual data in the buffer */ 8 void *payload; (2) 9 10 u16_t tot_len; (3) 11 12 /** length of this buffer */ 13 u16_t len; (4) 14 15 u8_t type_internal; (5) 16 17 /** misc flags */ 18 u8_t flags; (6) 19 20 LWIP_PBUF_REF_T ref; (7) 21 22 /** For incoming packets, this contains the input netif's index */ 23 u8_t if_idx; (8) 24 }; ``` (1):next是一个pbuf类型的指针,指向下一个pbuf,因为网络中的数据包可能很大,而pbuf能管理的数据包大小有限,就会采用链表的形式将所有的pbuf包连接起来,这样子才能完整描述一个数据包,这些连接起来的pbuf包会组成一个链表,我称之为pbuf链表。 (2):payload是一个指向数据区域的指针,指向该pbuf管理的数据区域起始地址,这里的数据区域可以是紧跟在pbuf结构体地址后面的RAM空间,也可以是ROM中的某个地址上,取决于pbuf的类型。 (3):tot_len中记录的是当前pbuf及其后续pbuf所有数据的长度,例如如果当前pbuf是pbuf链表上第一个数据结构,那么tot_len就记录着整个pbuf链表中所有pbuf中数据的长度;如果当前pbuf是链表上最后一个数据结构,那就记录着当前pbuf的长度。 (4):len表示当前pbuf中有效的数据长度。 (5):type_internal表示pbuf的类型,LwIP中有4种pbuf的类型,并且使用了一个枚举类型的数据结构定义他们,具体见代码清单 6 2。 (6):flags字段在初始化的时候一般被初始化为0,此处就不对flags字段进行过多讲解。 (7):ref表示该pbuf被引用的吃的啥,引用表示有其他制造指向当前pbuf,这里的指针可以是pbuf的next指针,也可以是其他任意形式的指针,初始化一个pbuf的时候,ref会被设置为1,因为该pbuf的地址一点会被返回一个指针变量,当有其他指针指向pbuf的时候,就必须调用相关函数将ref字段加1。 (8):if_idx用于记录传入的数据包中输入netif的索引,也就是netif中num字段。