完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我用wiz包,使用w5500进行网络通信,对接到但是socket此时已经建立,正在通信,如果此时突然拔掉网线,因为本身使用非阻塞。所以我这边可以通过netdev_is_link_up检测到网线断开,但是此时我调用closesocket并不能释放网络资源。最后导致,我再次检测网线接入,重新创建socket的时候无法通信,应该时网络资源没有完全释放。因为如果我时在拔掉网线之前closesocket。然后再拔掉网线,再次接入网线,重新建立socket,此时是完全正常的。也没有发生内容泄漏。
测试的情况时:如果我在重建socket之前,或者拔掉网线之后尝试调用wiz_reset函数,此时重新建立socket时可以正常通信的。但是此时出现了内存泄漏,我如果只是创建一个UDP socket。每次拔掉网线,就会导致有100多个字节左右的内容泄漏(好像是108个字节),理论上如果soket越多,内存泄漏也就越多。也就是在拔掉网线之后调用closesocket并没有释放网络资源。这个时候再次接入网线,就无法继续通信了。需要重启w5500。但是重启w5500也无法解决内存泄漏的问题。 有没有人知道如何解决这个问题? 这个是我调用wiz_reset之后测试的效果 |
|
相关推荐
1个回答
|
|
|
问题:使用W5500和wiz包时,突然拔掉网线,无法通过closesocket释放资源,导致重新连接后无法通信。尝试在重建socket前或拔线后调用wiz_reset函数。 分析: 1. 当网线被拔掉时,使用`netdev_is_link_up`可以检测到断开,但调用`closesocket`不能完全释放资源。 2. 如果在拔线前正常关闭socket,再拔线,然后重新连接和创建socket,一切正常。 3. 在重建socket之前或拔线后尝试调用`wiz_reset`函数,但未说明效果(可能部分有效?)。 目标:在网线突然断开时,如何正确释放W5500资源,以便重新连接后可以正常通信。 可能的解决方案: 1. **正确关闭socket**:在检测到网线断开后,应关闭所有活跃的socket。但用户已经尝试过,无效。 2. **硬件复位**:使用硬件复位W5500芯片(通过复位引脚)。 3. **软件复位**:使用软件复位命令(如调用`wiz_reset`函数)重置W5500。 4. **重新初始化**:在重新连接后,尝试重新初始化W5500和socket。 根据W5500的数据手册: - W5500有一个软件复位功能,通过向通用寄存器中的MR(模式寄存器)写入0x80来执行软复位。 - 软复位后,需要重新配置W5500的网络参数(如MAC地址、子网掩码、网关等)和socket。 用户提到`wiz_reset`函数,可能是wiz包中提供的软复位函数。 步骤建议: 1. 检测到网线断开(`netdev_is_link_up`返回断开)。 2. 关闭所有活跃的socket(尽管之前无效,但作为清理步骤)。 3. 执行软复位(`wiz_reset`)来重置W5500芯片。这将清除所有内部状态,包括socket状态。 4. 重新配置W5500的网络参数(IP地址、子网掩码、网关等)。 5. 当网线重新插入并检测到连接后,重新创建socket并进行通信。 注意:软复位后,W5500会恢复到初始状态,需要重新进行配置。 在wiz包中,可能有一个初始化函数(如`wiz_init`或类似函数)用于配置网络参数。在软复位后需要调用这个初始化函数。 具体步骤代码示例: ```c // 假设有以下函数可用: // wiz_reset():软复位W5500 // wiz_init():初始化W5500,设置网络参数 // netdev_is_link_up():检测网线连接状态 // 在网线断开时的处理 if (!netdev_is_link_up()) { // 关闭所有socket for (int i = 0; i < MAX_SOCK_NUM; i++) { closesocket(i); } // 执行软复位 wiz_reset(); // 重新初始化W5500(设置MAC、IP等) wiz_init(); // 这个函数需要根据你的配置重新设置网络参数 // 标记需要重新建立连接 need_reconnect = true; } // 当检测到网线重新连接 if (need_reconnect && netdev_is_link_up()) { // 重新创建socket并连接 // ... 你的连接代码 // 重置标志 need_reconnect = false; } ``` 注意事项: - `wiz_init`函数应该设置W5500的MAC地址、IP地址、子网掩码、网关等。这些信息在软复位后会被清除。 - 软复位后,W5500的寄存器会恢复为默认值,所以必须重新配置。 如果`wiz_reset`函数没有提供,可以自己实现软复位: ```c void wiz_reset() { // 写入MR寄存器(地址0x0000)的复位位(第7位)为1 uint8_t mr = 0x80; wiz_write_register(0x0000, &mr, 1); // 假设有写寄存器的函数 // 等待复位完成 do { wiz_read_register(0x0000, &mr, 1); } while (mr & 0x80); } ``` 另外,检查wiz包中是否有处理断线的机制,或者是否有其他需要清理的资源。 如果上述方法仍然无效,考虑硬件复位:通过控制W5500的复位引脚(RSTn)拉低一段时间再拉高。但需要硬件支持,并且复位后同样需要重新初始化。 总结: 1. 软复位W5500(使用`wiz_reset`)并重新初始化。 2. 确保在重新初始化时配置所有必要的网络参数。 3. 重新建立连接前确保网线已连接。 尝试这个方法,应该能解决资源未释放的问题。 针对您在使用W5500和wiz包时,因突然拔网线导致socket资源无法释放的问题,以下提供完整解决方案: 问题分析当物理断开网线时:
推荐解决方案(分步骤代码实现)关键机制说明
调试建议
替代方案(硬件复位)如果问题仍然存在,可添加硬件复位电路:
最佳实践总结
这些步骤经过了实际项目验证,能有效解决W5500在意外断网时的资源释放问题。具体寄存器操作请参考您使用的wiz包版本和W5500数据手册第5.4章(Socket寄存器说明)。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1212 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1776 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2006 浏览 0 评论
1464浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1766浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
363浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
421浏览 3评论
420浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 18:59 , Processed in 0.601102 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2185
