你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教下, 使用FreeRTOS+LwIP 开发版做客户端断开后不能够重...

[复制链接]
hpdell 提问时间:2017-11-19 11:51 /
请教下, 使用FreeRTOS+LwIP 开发版做客户端断开后不能够重新连接 ?

具体描述如下:

1、开发版作为客户端使用
2、初次上电能够正常通讯,也就是 开发板可以发送数据到服务器端,服务器端也能够发送数据到开发版客户端,服务器端断开、连接操作都正常
3、是不是开发版做客户端不能够主动断开 与服务器之间的连接啊 ?????
4、按下开发版客户端某个定义的按键后,重新再进行连接时,此时服务器不能够与开发版正常连接,程序貌似死在了如下函数里面,
     有哪些原因会出现这样的问题啊 ???????????


/**
* Is called every TCP_FAST_INTERVAL (250 ms) and process data previously
* "refused" by upper layer (application) and sends delayed ACKs.
*
* Automatically called from tcp_tmr().
*/
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;
    } else {
      pcb = pcb->next;
    }
  }
}


收藏 1 评论3 发布时间:2017-11-19 11:51

举报

3个回答
wenyangzeng 回答时间:2018-2-9 09:49:55
可能要对LWIP的配置参数重新初始化一下。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-2-9 09:58:36
每次设置都是对的话,对于初始数据看来都需要重新设置,你要检查初始设置为什么没有保存和认定,从这方面检查。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2018-2-9 10:49:08
这个问题是因为 TIME_WAIT状态 导致的。
某个连接处于TIME_WAIT状态时,
这意味着这个TCP连接并没有完全断开,该连接将不能再被使用。
事实上,对于我们比较有现实意义的是,这个端口将不能再被使用,
需要等待 2倍的报文最大生存时间后(即回到CLOSED状态后)才能使用。

为什么TIME_WAIT状态还需要等 2倍的报文最大生存时间后 才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,
按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);
但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,
因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,
所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
因此,TIME_WAIT状态还需要等 2倍的报文最大生存时间后(约1到4分钟)才能返回到CLOSED状态。

解决方法就是服务器在客户端的TIME_WAIT状态前,发送一个RST报文给对方,
这个时候TCP连接(关闭时)就不会进入TIME_WAIT状态。
这样做虽然解决了问题,但是并不安全。

付上:TCP建立连接三次握手和释放连接四次握手
http://blog.csdn.net/guyuealian/article/details/52535294

评分

参与人数 1蝴蝶豆 +5 收起 理由
zero99 + 5

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版