LWIP支持多网口设计,LWIP中使用netif来描述每种网络接口的特性,如接口的IP地址、接口状态等等。

netif结构体字段

netif结构体在文件netif.h中有定义

next 该字段指向下一个neitif类型的结构体,因为LWIP可以支持多个网络接口,
当设备有多个网络接口的话LWIP就会把所有的netif结构体组成链表来管理这些网络接口。
ipaddr 网络接口的IP地址
netmask 子网掩码
gw 默认网关
input 此字段为一个函数,这个函数将网卡接收到的数据交给IP层
output
- 此字段为一个函数,当IP层向接口发送一个数据包时调用此函数。
- 这个函数通常首先解析硬件地址,然后发送数据包。
- 此字段我们一般使用etharp.c中的etharp_output()函数。
linkoutput 此字段为一个函数,该函数被ARP模块调用,完成网络数据的发送。
上面说的etharp_output函数将IP数据包封装成以太网数据帧以后就会调用linkoutput函数将数据发送出去。
state 用来定义一些关于接口的信息,用户可以自行设置。
mtu 网络接口所能传输的最大数据长度,一般设置为1500。
hwaddr_len 网卡MAC地址长度,6个字节。
hwaddr MAC地址。
flags 网络的接口状态,属性信息字段。
name 网卡的名字。
num 此字段为协议栈为每个网络接口设置的一个编号,编号从0开始。

网络接口函数

  1. netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t
  2. *gw, void *state, netif_init_fn init, netif_input_fn input);
  3. netif_set_default(struct netif *netif);
  4. netif_set_up(struct netif *netif);

应用_客户端

tcp控制块

  1. sturct tcp_pcb
  2. {
  3. IP_PCB;
  4. IP_PCB_COMMON(struct tcp_pcb);
  5. u16_t remote_port;
  6. u8_t flags;
  7. u8_t pooltmr,poolinterval;
  8. ………
  9. tcp_sent_fn sent;
  10. tcp_recv_fn recv;
  11. tcp_connected_fn connected;
  12. tcp_pool_fn pool;
  13. tcp_err_fn errf;
  14. ………
  15. }

image.png

TCP回调函数

函数 描述
tcp_arg() 注册回调函数使用的参数
tcp_recv() 注册接收的回调函数
tcp_err() 注册出错处理的回调函数
tcp_sent() 注册发送成功的回调函数
tcp_poll() 注册轮训函数
tcp_accept() 当侦听到有客户端连接的话就会调用注册函数

TCP API函数

函数分组 API 函数 函数功能描述。
TCP连接建立 tcp_ new() 创建一个TCP的PCB控制块。
tcp_ bind() 为TCP的PCB控制块绑定一个本地IP地址和端☐号。
tcp_ listen()
开始TCP的PCB监听
tcp_ accept() 控制块acept字段注册的回调函数,侦听到连接时被调用
tcp_ accepted() 通知LWIP协议栈一个TCP连接被接受了。
tcp_ conect() 连接远端主机
发送TCP数据 tcp_ write() 构造一个报文并放到控制块的发送缓冲队列中
tcp_ sent() 控制块sent字段注册的回调函数,数据发送成功后被回调。
tcp_ outputO 将发送缓冲队列中的数据发送出去。
接收TCP数据 tcp_ recv() 控制块rev字段注册的回调函数,当接收到新数据时被调用
tcp_ recved() 当程序处理完数据后一定要调用这个函数,通知内核更新接收窗☐
轮询函数 tcp_ poll() 控制块poll字段注册的回调函数,该函数周期性调用
关闭和中止连接 tcp_ close() 关闭一个TCP连接
tcp_ err() 控制块err字段注册的回调函数,遇到错误时被调用
tcp_ abort() 中断TCP连接

image.png