搜索
bottom↓
回复: 5

lwip连接断开重连问题

[复制链接]

出0入0汤圆

发表于 2014-3-19 09:55:24 | 显示全部楼层 |阅读模式
stm32的lwip作为客户端,如果这时候中间网络断开,客户端还在维持这个无效的连接,不断的给服务器每10s发数据,在不超过(12*10)S的情况下(#define MEMP_NUM_TCP_SEG        12),
如果网络再恢复正常,下一次客户端再连接到服务器时会将这期间所有未发出的数据一并发到客户端,如果时间长了的话,不知道是怎么处理的,客户端会对这个无效的tcp连接如何处理?如何close掉?
我试验貌似自己不会close掉,很长时间后网络再正常的话,这个连接就再也无法连上给服务器发数据了(这个无效的tcp_active_pcbs依旧在队列里),不知道这是个怎么的处理过程?谁给讲解和指点一下啊?

出0入0汤圆

发表于 2014-3-21 15:17:37 | 显示全部楼层
/**
  * @brief  This function implements the tcp_err callback function (called
  *         when a fatal tcp_connection error occurs.
  * @param  arg: pointer on argument parameter
  * @param  err: 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;
                }
          }
}

出0入0汤圆

发表于 2014-4-16 09:06:42 | 显示全部楼层
  顶一下

出40入42汤圆

发表于 2014-4-16 09:19:34 | 显示全部楼层
如果你用stm32作为客户端,每10s发一次数据,为什么不用“短连接”形式?就是连接上了,就发数据,发完就断开;然后10s到了,就再连接,发数据,断开……如此重复
“长连接”检测断线的方法,是“心跳包检测”。这个在lwip里面有宏定义开启的,楼主可以去查查看。
心跳包就是,定时给对方发一个不带有效数据的包,然后对方要回一个应答包,如果不回,隔一段时间再发,如果还不回,再发,超过限定次数后,还是不回应则认为对方断线了。

出0入0汤圆

 楼主| 发表于 2014-4-16 15:58:58 | 显示全部楼层
落叶知秋 发表于 2014-4-16 09:19
如果你用stm32作为客户端,每10s发一次数据,为什么不用“短连接”形式?就是连接上了,就发数据,发完就断 ...

你说的心跳包是keeplive定时器吧,内核默认的是2个小时发一次,这个可以改小一点。
目前我的用法是用tcp的重发次数,把重发次数设小一点,这样,短时间内达到超时发送次数,我这就判断掉线了,我这边就释放
PCB,进行重连了。同样服务器内如果隔多长时间收不到数据,也会释放掉这个相对应的PCB。等待我的重连。

出40入42汤圆

发表于 2014-4-16 17:17:40 | 显示全部楼层
楼主问题解决了?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 07:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表