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。

posted @ 2022-07-12 17:33  不明白就去明白  阅读(421)  评论(0编辑  收藏  举报