战队头像logo免费自动生成器,seo网站优化培训要多少钱,蒙阴哪有做淘宝网站的,cms类型网站开发1. NETCONN接口简介
NETCONN API 使用了操作系统的 IPC 机制#xff0c; 对网络连接进行了抽象#xff0c;使用同一的接口完成UDP和TCP连接。 NETCONN API接口是在RAW接口基础上延申出来的一套API接口 首先会调用netconn_new创建一个pcb控制块#xff0c;其实际是一个宏定…1. NETCONN接口简介
NETCONN API 使用了操作系统的 IPC 机制 对网络连接进行了抽象使用同一的接口完成UDP和TCP连接。 NETCONN API接口是在RAW接口基础上延申出来的一套API接口 首先会调用netconn_new创建一个pcb控制块其实际是一个宏定义调用了netconn_new_with_proto_and_callback函数其就是先定义了一个netconn的结构体conn然后通过netconn_alloc申请内存并通过netconn_apimsg构建一个API消息
netconn_apimsg在里面就是调用tcpip_send_msg_wait_sem这个函数中显示构建了一系列消息的初始化然后调用sys_mbox_post发送邮箱
当然以上所述是需要通过宏定义修改才能实现的lwIP内核默认是直接调用RAW而不需要API消息如果是默认方式那么就会直接调用也就是直接通过lwip_netconn_do_newconn函数执行该函数中构建了一个api_msg结构体的指针msg然后只要msg-conn-pcb.tcp为空就调用peb_new创建内存这其中会根据宏定义判断是UDP还是TCP
UDP就会调用udp_new_ip_type里面调用udp_new进行创建pcb控制块创建完成后会调用udp_recv构建udp的recv回调函数这里的回到函数就不需要像RAW接口一样自己编写了lwIP已经实现了recv_udp里面创建流程跟之前讲的很像调用memp_malloc创建内存给netbuf结构体buf然后初始化buf的参数比如p和ptr指针还有IP地址和端口号最重要的就是调用sys_mbox_trypost发送邮箱给tcp线程然后会把当前pbuf的指针发送出去
2. NETCONN实现原理
NETCONN控制块 这里比较好用的是union这个联合体在里面定义了四个控制块分别是IP、TCP、UDP以及RAW控制块这里是通过union选定了之后其他的结构体参数就会自动连接到union选定的结构体之中非常方便
netconn中定义了netconn_type连接类型netconn_state表示当前的连接状态然后union pcb定义了四种控制块选其一err_t last_err表示最新错误sys_sem_t op_completed表示API同步的信号量以及sys_mbox_t recvmbox表示接收数据的邮箱等
NETCONN收发的数据管理 定义了netbuf的结构体包含pbuf类型的p和ptiji发送方IP地址ip_addr_t addr以及发送方端口号u16_t port
其中p和ptr都指向pbuf链表不同的是p一直只想pbuf链表的第一个pbuf结构而ptr可能指向链表的其他位置netbuf_next()和netbuf_first()操作ptr字段
addr和port来记录数据发送方的IP地址和端口号netbuf_fromaddr和netbuf_fromport这两个宏定义来返回addr和port字段
之前就有过解析在通过NETCONN创建udp的控制块中会有recv_udp函数来进行udp_recv的回到函数的编写是lwIP内核实现的recv_udp中会构造netbuf结构体的指针bufmemp_malloc之后buf的p和ptr指针都赋值paddr和port也是给定相应的Ip地址和端口号然后通过sys_mbox_trypost把buf发送出去
接收数据则是调用netconn_recv完成而该函数最后如果是调用了UDP协议会return netconn_recv_data函数这个函数中会调用sys_arch_mbox_fetch接收消息接受的就是buf这个pbuf数据接受到了之后会把他传入recvbuf之中然后遍历pbuf链表并调用memcpy进行拷贝获取udp数据到数据缓冲区g_lwip_demo_recvbuf之中。
针对netconn结构体中需要注意宏定义LWIP_SO_SNDTIMEO这个宏定义之0则recv和send函数都是阻塞状态也就是说接收和发送在同一任务重由超时事件来控制一般都不这么使用会影响效率所以这个宏置1
3. NETCONN实现原理 netconn_alloc创建了netconn结构体和邮箱调用了udp_new和udp_recv完成了udp控制块以及rcv的实现netconn_bind把IP地址和端口号传入netconn然后调用netconn_connect进行连接数据会先进入udp控制块进入pbuf后借由recv_udp给到发送邮箱recvnbox发送出去后在通过接收邮箱recvmbox接收到。
邮箱传输的是pbuf的地址pbuf由netbuf管理
NETCONN与RAW区别 NETCONN就类似于STM32的标准库开发而RAW接口类似于STM32寄存器开发
3. NETCONN相关函数 总结
NETCONN就是对RAW接口进行初步封装能够省去自己实现五个回调函数的步骤更好的进行抽象帮助我们开发以太网的连接。