正点原子lwIP学习笔记——NETCONN接口简介

1. NETCONN接口简介

NETCONN API 使用了操作系统的 IPC 机制, 对网络连接进行了抽象,使用同一的接口完成UDP和TCP连接。
NETCONN调用流程
NETCONN API接口是在RAW接口基础上延申出来的一套API接口

NETCONN调用流程
首先会调用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控制块

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结构体的指针buf,memp_malloc之后,buf的p和ptr指针都赋值p,addr和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示意图
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与RAW接口比对
NETCONN就类似于STM32的标准库开发,而RAW接口类似于STM32寄存器开发

3. NETCONN相关函数

相关函数

总结

NETCONN就是对RAW接口进行初步封装,能够省去自己实现五个回调函数的步骤,更好的进行抽象,帮助我们开发以太网的连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值