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_TIMEOUT
     here is enough. */
  return 1;
}
为了解决这个问题,‌可以采取以下几种策略:‌

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

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值