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

请教下, 使用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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版