一、UDP协议报文结构
PACK_STRUCT_BEGIN
struct udp_hdr
{
PACK_STRUCT_FIELD(u16_t src); /* 源端口号 */
PACK_STRUCT_FIELD(u16_t dest); /* 目的端口号 */
PACK_STRUCT_FIELD(u16_t len); /* UDP长度 */ PACK_STRUCT_FIELD(u16_t chksum); /* 校验和 */
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
二、UDP数据递交流程
三、UDP控制块结构
接收数据时,lwIP内核把数据递交给UDP控制块recv函数指针指向的函数
struct udp_pcb
{
IP_PCB; /* 通用IP控制块 */
struct udp_pcb *next; /* 下一节点的指针,用于构成控制块链表 */
u8_t flags; /* 控制块状态 */
u16_t local_port, remote_port; /* 本地端口号、远程端口号 */
udp_recv_fn recv; /* 处理网络接收数据的回调 */
void *recv_arg; /* 用户自定义参数,接收回调入参 */
};
四、UDP控制块原理
链接: 多个UDP控制块构建一个单向的链表
函数: 每一个控制块都管理一个接收回调函数
端口: lwIP内核根据端口号查找控制块
描述: 每一个控制块用来描述各自网络的信息
在UDP编程中,无论是那种接口,它们都是对UDP控制块进行操作
dup_pcb链表挂载多个控制块,数据包递交给“谁”处理?
遍历udp_pcbs链表,检查其中的本地端口号与报文首部中的目的端口号是否匹配,并递交给匹配成功的控制块处理
五、RAW接口简介
RAW接口UDP函数