2. UDP协议简介
UDP协议的中文名字是用户数据包协议,是一种无连接的(TCP是面向连接的),不可靠的传输协议。
缺点:因为UDP自身没有确认机制来确认数据包是否正确的发送到目的主机,因此UDP报文有可能丢失,出错等。
优点:UDP的协议代码量少,处理过程简洁,实时性好,因此适合那些对轻微的数据差错不敏感的应用,如网络电话和网络视频等。
3. UDP组织形式
LWIP中使用UDP控制块来描述UDP,UDP控制块是一个结构体,这个结构体在udp.h中。
struct udp_pcb {
IP_PCB; //见下文中3.1对IP_PCB的定义
struct udp_pcb *next; //完成链表
u8_t flags; //状态信息 可用的见下面3.2定义
u16_t local_port, remote_port; //本地端口和远端端口
#if LWIP_IGMP
ip_addr_t multicast_ip;
#endif
#if LWIP_UDPLITE
u16_t chksum_len_rx, chksum_len_tx;
#endif
udp_recv_fn recv; //接收回调函数 定义见3.3 将函数写好,赋给PCB的这个字段,LWIP在接收到数据的时候 //会自动调用这个函数进行处理
void *recv_arg;
};
3.1 IP_PCB定义
#define IP_PCB \
ip_addr_t local_ip; \
ip_addr_t remote_ip; \
u8_t so_options; \
u8_t tos; \
u8_t ttl \
IP_PCB_ADDRHINT
3.2 UDP_PCB的状态信息
#define UDP_FLAGS_NOCHKSUM 0x01U
#define UDP_FLAGS_UDPLITE 0x02U
#define UDP_FLAGS_CONNECTED 0x04U
#define UDP_FLAGS_MULTICAST_LOOP 0x08U
3.3 recv回调函数
typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port);
4. RAW_UDP相关API函数
new_udp() 新建一个UDP的PCB控制块
udp_remove() 将一个PCB控制块从链表中删除,并释放这个控制块的内存
udp_bind() 为UDP的PCB绑定一个本地IP地址和端口号
udp_connect() 连接到指定IP地址主机的指定端口号,其实就是设置PCB控制块的remote_ip和remote_port。
udp_disconnect() 断开连接
udp_send() 通过一个PCB控制块发送数据 |