11.9 UDP控制块UDP控制块是整个UDP协议实现的核心部分 。
LWIP使用UDP控制块来描述一个UDP连接的所有相关信息 , 包括源端口号、目的端口号、源IP、目的IP等等 。
LWIP为每个UDP连接都分配一个UDP控制块 , 并用链表udp_pcbs
链起来 。
但是LWIP也给UDP控制块数量设限制 , MEMP_NUM_UDP_PCB
为UDP控制块的内存池数量 。该宏缺省为8 。
UDP控制块数据结构:
#if LWIP_NETIF_USE_HINTS#define IP_PCB_NETIFHINT ;struct netif_hint netif_hints#else /* LWIP_NETIF_USE_HINTS */#define IP_PCB_NETIFHINT#endif /* LWIP_NETIF_USE_HINTS *//* This is the common part of all PCB types. It needs to be at thebeginning of a PCB type definition. It is located here so thatchanges to this common part are made in one location instead ofhaving to change all PCB structs. */#define IP_PCB\/* 按网络字节顺序排列的IP地址 */ \ip_addr_t local_ip;\ip_addr_t remote_ip;\/* 绑定的netif的索引 */\u8_t netif_idx;\/* 套接口选项 */\u8_t so_options;\/* 服务类型 */\u8_t tos;\/* TTL */\u8_t ttl\/* 链路层地址解析提示 */ \IP_PCB_NETIFHINT/** the UDP protocol control block */struct udp_pcb {IP_PCB; /* UDP控制块和IP协议相关的字段 */struct udp_pcb *next; /* UDP控制块链表节点 */u8_t flags; /* 控制块状态 */u16_t local_port, remote_port; /* 本地端口号和远端端口号 */#if LWIP_MULTICAST_TX_OPTIONS /* 支持组播相关 */#if LWIP_IPV4/* 组播数据包的出网络接口 , 通过IPv4地址(如果没有'any') */ip4_addr_t mcast_ip4;#endif /* LWIP_IPV4 *//* 组播数据包的出网络接口 , 根据接口索引(如果非零) */u8_t mcast_ifindex;/* 发送数据时 , 组播报文的TTL值 */u8_t mcast_ttl;#endif /* LWIP_MULTICAST_TX_OPTIONS */#if LWIP_UDPLITE /* 支持UDP LITE */u16_t chksum_len_rx, chksum_len_tx; /* 接收、发送数据时需要进行校验的数据长度 */#endif /* LWIP_UDPLITE *//* 接收回调函数 */udp_recv_fn recv;/* 接收回调函数参数 */void *recv_arg;};
11.10 端口号相关11.10.1 端口号范围#define UDP_LOCAL_PORT_RANGE_START0xc000#define UDP_LOCAL_PORT_RANGE_END0xffff#define UDP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & (u16_t)~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START))
11.10.2 端口号初始值UDP的端口号由全局值udp_port
累加管理 。
其初始值有两次初始:第一次是变量赋值 , 第二次是调用udp_init()
进行随机初始 。
变量初始值:
/* last local UDP port */static u16_t udp_port = UDP_LOCAL_PORT_RANGE_START;
随机初始化:
- 需要开启LWIP随机宏
LWIP_RAND
。
/** * Initialize this module. */voidudp_init(void){#ifdef LWIP_RANDudp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());#endif /* LWIP_RAND */}
11.10.3 udp_new_port()端口号申请端口号申请是有udp_port
进行累加 , 溢出就复位到UDP_LOCAL_PORT_RANGE_START
。/** * Allocate a new local UDP port. * * @return a new (free) local UDP port number */static u16_tudp_new_port(void){u16_t n = 0;struct udp_pcb *pcb;again:if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) { /* 累加获取 */udp_port = UDP_LOCAL_PORT_RANGE_START; /* 溢出复位 */}/* Check all PCBs. */for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { /* 检查是否有重复 */if (pcb->local_port == udp_port) { /* 重复 */if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {return 0; /* 如果所有端口号都重复了 , 返回申请失败 */}goto again; /* 重新申请 */}}return udp_port; /* 申请成功 */}
11.11 UDP控制块操作函数UDP控制块的操作函数相对简单 , 因为没有流量控制、没有确认机制等等 。11.11.1 udp_new():新建UDP控制块
udp_new()
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 财随风滚滚来 未来33天这4大星座横财不断
- 未来2年4大星座取得一些巨大的成就 金钱会暴涨生活喜事不断
- 健康吃雪糕的3个技巧 吃雪糕要注意些什么
- 属虎跟属牛的相配吗 做夫妻好不好
- 属鸡人和属鸡人合不合 争论无休应该多多谦让
- 今年小暑是几月几日几点2023
- 2023年小暑时间几点几分几秒
- 戊午日柱配偶 粗中有细相辅相成
- 属猴男和属牛女适合结婚吗 五行相生财运亨通
- 魔力宝贝:旅人声望怎么获取