野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21140|回复: 2

网络死循环

[复制链接]
发表于 2016-5-10 17:10:50 | 显示全部楼层 |阅读模式
麻烦问一下以下的情况是怎么回事?
1.首先连接好网线和打开网络助手,
2.然后开始运行程序,能够收到数据,
3.此时关闭网络助手,然后再打开
网络助手,数据传输正常
4.拔掉网线,再插上网线,
5.就会进入下面这个函数的while死循环,
6.但是如果没有进行第3步,直接进行第4步,传输数据一直正常。
所以我认为跟网络助手的开关有关系,只要中途不开关网络助手都不会出问题,只要出现一次开关网络助手,就会出现死循环,不知火哥怎么认为?
注:我使用的是RMII-以太网LAN8710A下的Ethernet_TCP_client的例程
程序会死在tcp.c中while里面:
void
tcp_fasttmr(void)
{
  struct tcp_pcb *pcb;

  ++tcp_timer_ctr;

tcp_fasttmr_start:
  pcb = tcp_active_pcbs;

  while(pcb != NULL) {
    if (pcb->last_timer != tcp_timer_ctr) {
      struct tcp_pcb *next;
      pcb->last_timer = tcp_timer_ctr;
      /* send delayed ACKs */
      if (pcb->flags & TF_ACK_DELAY) {
        LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
        tcp_ack_now(pcb);
        tcp_output(pcb);
        pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
      }


      next = pcb->next;


      /* If there is data which was previously "refused" by upper layer */
      if (pcb->refused_data != NULL) {
        tcp_active_pcbs_changed = 0;
        tcp_process_refused_data(pcb);
        if (tcp_active_pcbs_changed) {
          /* application callback has changed the pcb list: restart the loop */
          goto tcp_fasttmr_start;
        }
      }
      pcb = next;
    }
  }
}




回复

使用道具 举报

发表于 2016-5-11 09:02:18 | 显示全部楼层
应用里加个检测tcp连接是否有效的操作,无效了重新监听连接,这样估计可以
回复 支持 反对

使用道具 举报

发表于 2020-9-18 13:49:09 | 显示全部楼层
flyleaf 发表于 2016-5-11 09:02
应用里加个检测tcp连接是否有效的操作,无效了重新监听连接,这样估计可以 ...

不行的,这样不能完全解决问题我已经试了,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 10:04 , Processed in 0.026410 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表