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开始。 |
网络接口函数
netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t
*gw, void *state, netif_init_fn init, netif_input_fn input);
netif_set_default(struct netif *netif);
netif_set_up(struct netif *netif);
应用_客户端
tcp控制块
sturct tcp_pcb
{
IP_PCB;
IP_PCB_COMMON(struct tcp_pcb);
u16_t remote_port;
u8_t flags;
u8_t pooltmr,poolinterval;
………
tcp_sent_fn sent;
tcp_recv_fn recv;
tcp_connected_fn connected;
tcp_pool_fn pool;
tcp_err_fn errf;
………
}
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连接 |