当前位置: 首页 > news >正文

lwip 3. 网线拔掉后 lwip_recvfrom不能返回

当网线被拔掉后,‌LWIP的lwip_recvfrom函数无法返回,‌这通常意味着网络连接已经断开,‌而LWIP没有自动检测到这种断开并进行相应的处理。具体卡在这个地方:

ret = xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY);	

//具体函数

u32_t
sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout_ms)
{BaseType_t ret;void *msg_dummy;LWIP_ASSERT("mbox != NULL", mbox != NULL);LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);if (!msg) {msg = &msg_dummy;}if (!timeout_ms) {/* wait infinite */ret = xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY);	//等待网络数据接收LWIP_ASSERT("mbox fetch failed", ret == pdTRUE);} else {TickType_t timeout_ticks = timeout_ms / portTICK_RATE_MS;ret = xQueueReceive(mbox->mbx, &(*msg), timeout_ticks);if (ret == errQUEUE_EMPTY) {/* timed out */*msg = NULL;return SYS_ARCH_TIMEOUT;}LWIP_ASSERT("mbox fetch failed", ret == pdTRUE);}/* Old versions of lwIP required us to return the time waited.This is not the case any more. Just returning != SYS_ARCH_TIMEOUThere is enough. */return 1;
}
为了解决这个问题,‌可以采取以下几种策略:‌

使用Keep-Alive功能:‌通过启用LWIP的Keep-Alive功能,‌可以定期检测网络连接是否保持活跃。‌如果检测到网络断开,‌可以释放相关资源并重新尝试连接1。‌
利用回调机制:‌在LWIP中,‌可以利用回调机制来检测网络连接状态。‌例如,‌当建立连接成功时,‌可以设置一个标志位,‌并在主循环中检查这个标志位来确定是否需要执行某些操作,‌如重新连接或释放资源1。‌
主动检测网络状态:‌通过读取物理层的状态(‌如ETH_ReadPHYRegister函数)‌或使用特定的硬件计数器(‌如RJ45_COUNTER)‌,‌可以主动检测网络是否断开。‌一旦检测到断开,‌可以触发相应的处理逻辑,‌比如重新连接或等待网络恢复1。‌
错误处理:‌对于lwip_recvfrom返回的错误,‌应该进行适当的错误处理。‌这包括检查错误代码以确定问题的具体原因,‌并据此采取相应的措施。‌例如,‌如果错误是由于网络断开引起的,‌那么尝试重新建立连接可能是必要的2。‌
综上所述,‌解决网线拔掉后LWIP无法正确响应的问题需要结合使用Keep-Alive功能、‌利用回调机制、‌主动检测网络状态以及适当的错误处理策略。‌这些措施可以帮助确保即使在网络断开的情况下,‌LWIP也能正确地响应并尝试恢复连接。‌

http://www.lryc.cn/news/420353.html

相关文章:

  • Linux环境安装Docker Engine
  • 大厂面试题分享
  • FPGA面试问题整理
  • 3Done学习笔记
  • AI学习指南深度学习篇-卷积层详解
  • 2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂
  • 如何在Java、C、Ruby语言中使用Newscatcher API
  • 集合: Collection的成员方法和相关实现类
  • 过滤器与监听器:深入了解 Java Web 开发中的核心概念
  • 【Linux学习】动静态库从原理到制作
  • WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框
  • JavaFX对话框控件-ChoiceDialog
  • 一文了解BTC中的二层协议中Nervos network,CKB,RGB++,UTXO stack 之间的关系
  • Oracle(47)如何创建和使用集合?
  • SpringIOC和SpringAOC
  • static关键字详解
  • 使用 Java RestClient 与 Elasticsearch 进行索引管理的示例
  • 编程-设计模式 10:外观模式
  • 非范型ArrayList和泛型List<T>
  • 魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化
  • 03、流程控制语句
  • [Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题
  • Armv8/Armv9架构中的原子性
  • 读零信任网络:在不可信网络中构建安全系统15协议和过滤
  • C语言学习笔记 Day11(指针--中2)
  • Golang 并发编程
  • 【数据结构详解】——选择排序(动图详解)
  • 杂项命令(笔记)
  • 代码随想录算法训练营Day38||完全背包问题、leetcode 518. 零钱兑换 II 、 377. 组合总和 Ⅳ 、70. 爬楼梯 (进阶)
  • 超越链端:Web3的无边界技术革命