LWIP有3种编程接口,分别为:RAW、NETCONN和SOCKET
RAW:RAW编程接口不需要操作系统的支持,可以直接裸机使用LWIP,但是RAW编程接口比较复杂!RAW使用的是回调机制,需要大家了解回调函数。
NETCONN和SOCKET:这两种编程接口都需要有操作系统的支持,否则的话没法使用,但是这两种接口使用起来比较简单。
至于究竟使用哪一个就看自己的需求了,建议在实际项目中使用NETCONN或SOCKET编程接口,开发难度低。
LWIP中使用UDP控制块来描述UDP,UDP控制块是UDP协议最核心的东西,UDP控制块是一个结构体,这个结构体在udp.h中定义。
struct udp_pcb
{
IP_PCB; //宏IP_PCB中的各个字段
struct udp_pcb *next; //指向udp_pcb,用于将控制块组织成链表
u8_t flags; //控制块状态字段
u16_t local_port, remote_port; //本地端口号和目的端口号
udp_recv_fn recv; //处理数据的回调函数
void *recv_arg; //传递给回调函数的参数
};
其中 IP_PCB; //宏IP_PCB中的各个字段
#define IP_PCB struct ip_addr local_ip; \ //本地ip地址
struct ip_addr remote_ip; \ //远端ip地址
/* Socket options */ \
u16_t so_options; \
/* Type Of Service */ \
u8_t tos; \
/* Time To Live */ \
u8_t ttl; \
/* link layer address resolution hint */ \
IP_PCB_ADDRHINT
UDP控制块链表如下:
UDP层函数关系如下图:
void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port);
err_t udp_send(struct udp_pcb *pcb, struct pbuf *p);