嵌入式技术论坛
直播中

世态薄凉

8年用户 1170经验值
私信 关注
[问答]

w5500通信使用wiz包时,拔掉网线后如何释放网络资源?

我用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.png

回帖(2)

夏日余晖

2023-9-3 09:51:56
找到原因了。wiz包的closesocket中会检查网线连接情况,网线未连接,直接返回错误。理论上应该创建socket时检查网络连接情况,关闭socket也检查,就会导致把网线的时候。closesocket直接检查网线未接,直接返回,导致内存泄漏!!
1.png
举报

1653339509.516700

2023-9-28 09:37:21
esocket函数不能完全释放网络资源。这种情况下,建议在检测到网线断开后,调用shutdown函数来关闭socket,并确保将收到的数据读取并处理完毕。然后再调用closesocket函数来释放网络资源。这样可以避免内存泄漏的问题。另外,如果需要重新建立socket,不要忘记重新配置socket的相关参数,比如IP地址、端口等。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分