UDP详解
用户使用UDP进行编程,以及内核对UDP报文的处理,本质上都是对UDP控制块的操作。
//用于控制块的flags字段,标识控制块的状态连接
#define UDP_FLAGS_NOCHKSUM 0x01U //不进行校验和的计算
#define UDP_FLAGS_UDPLITE 0x02U
#define UDP_FLAGS_CONNECTED 0x04U //控制块已和远端建立连接
#define UDP_FLAGS_MULTICAST_LOOP 0x08U
//定义回调函数类型
typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
ip_addr_t *addr, u16_t port);
//定义控制块结构体
struct udp_pcb {
IP_PCB; //宏IP_PCB中的各个字段
struct udp_pcb *next; //用于将控制块组织成链表的指针
u8_t flags; //控制块状态字段
u16_t local_port, remote_port; //保存本地端口号和远端端口号,使用主机字节序
#if LWIP_IGMP
/** outgoing network interface for multicast packets */
ip_addr_t multicast_ip;
#endif /* LWIP_IGMP */
#if LWIP_UDPLITE
/** used for UDP_LITE only */
u16_t chksum_len_rx, chksum_len_tx;
#endif /* LWIP_UDPLITE */
udp_recv_fn recv; //处理数据时的回调函数
void *recv_arg; //当调用回调函数时,将传递给函数的用户自定义的数据信息
};
IP_PCB宏
#define IP_PCB \
ip_addr_t local_ip; \
ip_addr_t remote_ip; \
u8_t so_options; \ //socket连接
u8_t tos; \ //服务类型
u8_t ttl \ //生存时间
IP_PCB_ADDRHINT
struct ip_pcb {
IP_PCB;
};
被使用最多的是前两个,本地IP,远程IP。
懒惰不会让你一下子跌到
但会在不知不觉中减少你的收获;
勤奋也不会让你一夜成功
但会在不知不觉中积累你的成果
越努力,越幸运。