完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如题:LWIP中 udp_send(uPCB, p); 之后马上调用 pbuf_free(p); 行么 ?
udp_send(upcb, p); 调用之后, 数据不一定就发出了, 至少在申请 arp解析 IP 地址时, 先要发地址解析包. 因此 udp_send(upcb, p); 调用之后, 马上调用 pbuf_free(p); 就可能释放掉还要使用的内存. 我的理解对么 ? 请大侠们 指点 . ===================================== 刚才进一步查了, 在udp_send中,当调用到 etharp_query 时, 如果要解析地址, 就 把数据复制一份. 因此 udp_send 返回后,可以 立即 调用 pbuf_free(p); ===================================== 讨论: 虽然 etharp_query 把数据复制一份. 但占用多的空间. 如果 只是增加 该数据包的引用数, 应该可行 ? |
|
相关推荐
1个回答
|
|
在LWIP中,`udp_send(upcb, p)`函数用于发送一个UDP数据包。这个函数会将`p`(一个`pbuf`结构体)传递给LWIP的UDP层,然后LWIP会处理这个数据包,包括可能的ARP解析、路由查找等。在这个过程中,LWIP可能会修改`pbuf`结构体,例如添加或删除一些链表节点。
关于您的问题,`udp_send(upcb, p)`之后马上调用`pbuf_free(p)`是否可行,答案是不一定。原因如下: 1. 如果`udp_send(upcb, p)`成功发送了数据包,并且LWIP不再需要这个`pbuf`结构体,那么调用`pbuf_free(p)`是安全的。 2. 但是,如果`udp_send(upcb, p)`在发送数据包的过程中遇到一些问题,例如ARP解析失败或路由查找失败,那么LWIP可能会在稍后重试发送。在这种情况下,如果立即调用`pbuf_free(p)`,可能会导致释放掉还在使用的内存,从而导致问题。 因此,为了确保安全,您可以在`udp_send(upcb, p)`调用之后,等待一段时间(例如,通过延时或轮询状态),直到确认数据包已经发送完毕或者不再需要重试。在这种情况下,再调用`pbuf_free(p)`会比较安全。 另外,LWIP提供了一个回调函数机制,允许您在数据包发送完成后执行一些操作。您可以在创建UDP PCB时注册一个`recv`回调函数,当数据包发送完毕时,LWIP会自动调用这个回调函数。在回调函数中,您可以安全地调用`pbuf_free(p)`来释放内存。 总之,您对这个问题的理解是正确的。在`udp_send(upcb, p)`之后立即调用`pbuf_free(p)`可能会导致问题,特别是在数据包发送过程中遇到问题时。为了确保安全,建议在发送完成后或在回调函数中释放内存。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 10:09 , Processed in 0.719896 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号