lwip连接断开重连问题
stm32的lwip作为客户端,如果这时候中间网络断开,客户端还在维持这个无效的连接,不断的给服务器每10s发数据,在不超过(12*10)S的情况下(#define MEMP_NUM_TCP_SEG 12),如果网络再恢复正常,下一次客户端再连接到服务器时会将这期间所有未发出的数据一并发到客户端,如果时间长了的话,不知道是怎么处理的,客户端会对这个无效的tcp连接如何处理?如何close掉?
我试验貌似自己不会close掉,很长时间后网络再正常的话,这个连接就再也无法连上给服务器发数据了(这个无效的tcp_active_pcbs依旧在队列里),不知道这是个怎么的处理过程?谁给讲解和指点一下啊? /**
* @briefThis function implements the tcp_err callback function (called
* when a fatal tcp_connection error occurs.
* @paramarg: pointer on argument parameter
* @paramerr: not used
* @retval None
*/
/*
luodefu - If a connection is aborted because of an error, the application is
alerted of this event by the err callback. Errors that might abort a connection
are when there is a shortage of memory. The callback function to be called is
set using the tcp_err() function.
The error callback function does not get the pcb passed to it as a parameter
since the pcb may already have been deallocated.
*/
static void ModbusTCPClient_error(void *arg, err_t err)
{
struct ModbusTCPClient_Struct *pModbusTCPClient;
LWIP_UNUSED_ARG(err);
pModbusTCPClient = (struct ModbusTCPClient_Struct *)arg;
/* luodefu - 三种情况调用error函数:
(1)连接失败 :调用tcp_connect后,大概20秒报连接出错,其中arg参数
就是tcp_arg(tpcb, pModbusTCPClient)注册的pModbusTCPClient参数;
(2)服务器关闭:实际测试表明,如果modbus server关闭连接,lwip也会调用此函
数,这时释放tpcb和pModbusCmd资源;
(3)网络断线重连:这种情况比较特殊,arg为NULL,所以需要检测arg是否为NULL,
否则会导致系统hard fault异常。
*/
if ( (pModbusTCPClient != NULL) &&
(pModbusTCPClient->state != ES_NOT_CONNECT) ) {
/* Cloce ModbusTCP Client */
/* The error callback function does not get the pcb passed to it as a
parameter since the pcb may already have been deallocated. */
/* pModbusTCPClient->pcb也许已经被释放 */
pModbusTCPClient->state = ES_NOT_CONNECT;//重置为未连接状态
pModbusTCPClient->pcb = NULL;
if (pModbusTCPClient->pModbusCmd != NULL) {
/* there is a remaining pbuf (chain) */
pbuf_free(pModbusTCPClient->pModbusCmd);
pModbusTCPClient->pModbusCmd = NULL;
}
}
}
顶一下 如果你用stm32作为客户端,每10s发一次数据,为什么不用“短连接”形式?就是连接上了,就发数据,发完就断开;然后10s到了,就再连接,发数据,断开……如此重复
“长连接”检测断线的方法,是“心跳包检测”。这个在lwip里面有宏定义开启的,楼主可以去查查看。
心跳包就是,定时给对方发一个不带有效数据的包,然后对方要回一个应答包,如果不回,隔一段时间再发,如果还不回,再发,超过限定次数后,还是不回应则认为对方断线了。 落叶知秋 发表于 2014-4-16 09:19
如果你用stm32作为客户端,每10s发一次数据,为什么不用“短连接”形式?就是连接上了,就发数据,发完就断 ...
你说的心跳包是keeplive定时器吧,内核默认的是2个小时发一次,这个可以改小一点。
目前我的用法是用tcp的重发次数,把重发次数设小一点,这样,短时间内达到超时发送次数,我这就判断掉线了,我这边就释放
PCB,进行重连了。同样服务器内如果隔多长时间收不到数据,也会释放掉这个相对应的PCB。等待我的重连。 楼主问题解决了?
页:
[1]