lwip netbuf

lwip2.0.2

netbuf_new——分配netbuf结构体的内存。

netbuf_alloc,分配netbuf中pbuf内存(pbuf_alloc中PBUF_RAM类型,包括pbuf结构体和payload区),如果使用nefbuf_ref的话,则不需要此步

netbuf_ref,分配netbuf中pbuf内存(pbuf_alloc中PBUF_REF类型,包括pbuf结构体,无payload区)

netbuf_free,调用的是pbuf_free

netbuf_delete,删除nef_buf结构体

使用方法:

接收过程————

  定义netbuf指针,netbuf结构体协议栈会分配(没找到在哪儿分配的?见后面分析),包括pbuf和netbuf结构体

  接收函数会获取协议栈分配的netbuf指针——netconn_recv(conn, &buf);  

  获取数据和长度——netbuf_data(bufrx, (void *)&drcv, &dlen);  !!!netbuf有可能有好几个,可能需要遍历。

  释放netbuf结构体(同时释放netbuf结构体和pbuf内存)——netbuf_delete(bufrx);

发送过程————

  ——已有数据,datasend[100]

    定义netbuf指针(能否直接定义netbuf变量?)——struct netbuf *buf;

    申请netbuf结构体——buf = netbuf_new();

    引用待发送的数据——netbuf_ref(buf, datasend, 20);

    发送数据——netconn_sendto(conn, buf, &addrto, 2020);

接收过程的netbuf在哪儿分配的:

udp.c中的udp_input中最后会调用

pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);

pcb的recv的是新建netconn时,pcb_new时挂接的,

挂接的是api_msg.c中的recv_udp函数,在这里完成mbox post

在该函数里分配netbuf,

会往netconn的接收邮箱中发送消息(对于netconn而言,只有接收邮箱,没有发送邮箱,发送是不需要邮箱的

sys_mbox_trypost(&conn->recvmbox, buf)

在以下函数中完成

api_lib.c中的netconn_recv,对于udp最后会调用netconn_recv_data

最后会调用sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout),接收邮箱

原文地址:https://www.cnblogs.com/yanhc/p/8158257.html