
请教下, 使用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; } } } |
评分
查看全部评分
评分
查看全部评分
某个连接处于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
评分
查看全部评分