LWIP之NETCONN API 函数

NETCONN API 函数


函数 netconn_new 用来创建一个新的连接结构。连接结构的类型可以选择为 TCP UDP等。函数结构原型如下所示,参数 type 描述了连接的类型,可以为 NETCONN_TCP 或NETCONN_UDP 等,这里都以 TCP 作为讨论的对象。
struct netconn* netconn_new(enum netconn_type type)
该函数首先调用 netconn_alloc 函数分配并初始化一个 netconn 结构。初始化的过程包括设置 netconn 结构类型字段,同时为该结构的 op_completed 创建一个信号量、 recvmbox 字段创建一个接收邮箱。奇怪的是 netconn_alloc 函数并不是在文件 api_lib.c 文件中,而是在api_msg.c 中,凌乱!接下来函数 netconn_new 会构建一个 api_msg 消息,该消息要求内核执行函数 do_newconn,最后函数 tcpip_apimsg 用来将消息包装成 tcpip_msg 结构并发送出去。tcpip_thread 函数解析该消息并调用函数 do_newconn do_newconn 根据参数的类型最终调用.

函数 tcp_new 创建一个 TCP 控制块。 tcpip_apimsg 会阻塞在一个信号量上,直至 do_newconn释放该信号量。
函数 netconn_delete 用来删除一个连接结构 netconn。与前面的流程相同,它通过消息告诉内核执行 do_delconn,调用 tcp_close 函数关闭 TCP 连接。而后 netconn_delete 调用netconn_free 函数释放 netconn 结构的空间。注意这里的 netconn_free 函数 netconn_alloc 函数一样,也不是在文件 api_lib.c 文件中,而是在 api_msg.c 中,尽管他们都是netconn_xxx 结构。

 LWIP之NETCONN API 函数_第1张图片

netconn_bind 用于将一个 IP 地址及端口号与结构 netconn 绑定。事实上,内核是通过函 do_bind 调用 tcp_bind 完成相应 TCP 控制块得绑定工作的。
netconn_connect 函数一般在客户端调用,用以将服务器端的 IP 地址和端口号与ᴀ地的netconn 结构绑定。该函数与内核 tcp_connect 函数对应。
netconn_listen 函数一般在服务器端调用,用于将某个 TCP 控制块置为 LISTEN 状态。类似的函数 do_listen 会被调用,该函数有两个重要的工作:为结构 netconn 字段 acceptmbox创建邮箱,该邮箱用于接受外部连接;向相应 TCP PCB 控制块中 accept 字段注册一个回调函数 accept_function,当该 PCB 上有新连接出现时,回调函数会被调用,以向上面的acceptmbox 邮箱中发送消息,告诉应用程序有新的连接到来,新连接的信息以 netconn 结构形式被保存在了邮箱中。
netconn_accept 函数在服务器上使用,用于接收远端的连接,该函数主要在阻塞在上面所述的 acceptmbox 邮箱上,当接收到新的连接后,在该邮箱上取下连接的 netconn 结构并返回。
netconn_recv 函数用于接收数据,接收到得数据被封装为 netbuf 结构。这里内核函数tcp_recved 会被协议栈调用,以通知内核数据被正常接收,内核因此调整发送窗结构,返回ACK 确认等。
函数 netconn_write 用于向相应的 TCP 连接上发送数据,主要这个函数只用于发送 TCP数据,用于发送 UDP 数据的函数叫 netconn_send,这里先不讨论。 netconn_write 函数原型如下,它用于将 dataptr 指向的 size 个数据放到连接 conn 的发送队列上, apiflags 用于描述
err_t netconn_write(struct netconn *conn, const void *dataptr, int size, u8_t apiflags)对该数据的操作,包括是否拷贝,是否立即发送两种选择。最后 netconn_close 函数用于主动关闭连接。


你可能感兴趣的:(ARM)