请教下, 使用FreeRTOS+LwIP 开发版做客户端断开后不能够重...
请教下, 使用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;
}
}
}
可能要对LWIP的配置参数重新初始化一下。 每次设置都是对的话,对于初始数据看来都需要重新设置,你要检查初始设置为什么没有保存和认定,从这方面检查。 这个问题是因为 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]