:
- 从
MEMP_UDP_PCB
内存池中获取UDP控制块资源 。 - 初始化部分字段 。
/** * @ingroup udp_raw * Creates a new UDP pcb which can be used for UDP communication. The * pcb is not active until it has either been bound to a local address * or connected to a remote address. * @see MEMP_NUM_UDP_PCB * * @return The UDP PCB which was created. NULL if the PCB data structure * could not be allocated. * * @see udp_remove() */struct udp_pcb *udp_new(void){struct udp_pcb *pcb;LWIP_ASSERT_CORE_LOCKED(); /* 内核锁确认 */pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB); /* 申请UDP控制块资源 */if (pcb != NULL) {memset(pcb, 0, sizeof(struct udp_pcb));pcb->ttl = UDP_TTL; /* UDP数据出口默认的TTL值 */#if LWIP_MULTICAST_TX_OPTIONS /* 多播TX相关 */udp_set_multicast_ttl(pcb, UDP_TTL);#endif /* LWIP_MULTICAST_TX_OPTIONS */}return pcb;}
11.11.2 udp_remove():删除UDP控制块udp_remove()
:struct udp_pcb *pcb
:需要删除的UDP控制块 。
/** * @ingroup udp_raw * Removes and deallocates the pcb. * * @param pcb UDP PCB to be removed. The PCB is removed from the list of * UDP PCB's and the data structure is freed from memory. * * @see udp_new() */voidudp_remove(struct udp_pcb *pcb){struct udp_pcb *pcb2;LWIP_ASSERT_CORE_LOCKED(); /* 内核所内 */LWIP_ERROR("udp_remove: invalid pcb", pcb != NULL, return);mib2_udp_unbind(pcb);/* 先从udp_pcbs链表中移除 */if (udp_pcbs == pcb) {/* 如果当前UDP控制块是udp_pcbs的链表头 , 则直接更新链表头即可移除 */udp_pcbs = udp_pcbs->next;} else { /* 需要遍历udp_pcbs , 把当前UDP控制块移除 */for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {if (pcb2->next != NULL && pcb2->next == pcb) {pcb2->next = pcb->next;break;}}}/* 释放内存资源 */memp_free(MEMP_UDP_PCB, pcb);}
11.11.3 udp_bind():绑定控制块当UDP服务于应用程序时 , 数据流需要底层和应用层进行对接 , 就需要把UDP控制块绑定到本地IP和端口号 。绑定控制块时需要注意的是:
- 检查是否有PCB已经绑定了当前IP和端口号 。
- 当前PCB有没有已经插入了
udp_pcbs
链表 。
SOF_REUSEADDR
选项功能时 , 需要确保一个UDP报文最多只能到达一个应用程序 。即是一个网络接口中的一个端口号 。需要注意的是任意IP 。udp_bind()
:struct udp_pcb *pcb
:需要绑定本地IP和端口号的UDP控制块 。
ip_addr_t *ipaddr
:UDP控制块需要绑定的本地IP地址 。
- 如果为NULL , 则绑定本地IP为全0的IP 。即表示本地任意IP都可 。
- 如果不为空 , 则绑定指定的本地IP 。
u16_t port
:UDP控制块需要绑定的本地端口号 。
- 如果为0 , 则绑定由内部调用
udp_new_port()
随机生成端口号 。 - 如果不为0 , 则绑定指定的端口号 。
- 如果为0 , 则绑定由内部调用
- 先检查下当前UDP控制块有没有插入了
udp_pcbs
链表 , 因为绑定成功后 , 需要插入该链表 。已经插入了 , 就不需要重复操作 。
- 检查绑定的IP地址 。传入为空 , 则赋值为全0的IP地址 。
- 检查绑定的端口号 。
- 如果为0 , 则调用
udp_new_port()
生成一个并绑定 。
- 如果不为0 , 则遍历
udp_pcbs
链表 , 判断是否有其它UDP控制块重复使用这个端口号 。确保一个UDP报文最多只有一个应用程序去向 。相同条件:端口号相同且IP报文能到达这个服务 。IP报文能否到达这个服务 , 可以通过以下判断(其一即符合要求):重复端口号的UDP控制块绑定的IP对比当前UDP控制块需要绑定的IP 。经验总结扩展阅读
- 财随风滚滚来 未来33天这4大星座横财不断
- 未来2年4大星座取得一些巨大的成就 金钱会暴涨生活喜事不断
- 健康吃雪糕的3个技巧 吃雪糕要注意些什么
- 属虎跟属牛的相配吗 做夫妻好不好
- 属鸡人和属鸡人合不合 争论无休应该多多谦让
- 今年小暑是几月几日几点2023
- 2023年小暑时间几点几分几秒
- 戊午日柱配偶 粗中有细相辅相成
- 属猴男和属牛女适合结婚吗 五行相生财运亨通
- 魔力宝贝:旅人声望怎么获取
- 如果为0 , 则调用