OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5179|回复: 3

LWIP中TCPclient连接一段时间后总是出现ERR_CONN错误

[复制链接]

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2019-9-13
在线时间
58 小时
发表于 2021-4-15 15:28:19 | 显示全部楼层 |阅读模式
1金钱
求助。。平台:F429,连接TCPserver后挂着过一段时间就接收不到数据了,如果把服务器关掉重新开就再也接不上了,变成ERR_CONN。然后就卡死在这个while里了
下面附代码:
    while (1)
    {
        log_i("tcp server connecting :%d......", server_port );
        tcp_clientconn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
        err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器
        if(err != ERR_OK)  netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
        else if (err == ERR_OK)    //处理新连接的数据
        {
            struct netbuf *recvbuf;
            tcp_clientconn->recv_timeout = 1000;//防止阻塞实时检测连接-(时间太短导致大包接收出错?)
            netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
            log_i("TCP Server %s:%d connected sucess.", server_ipaddr, server_port );
            xTaskNotify( LedTaskHandle, 200, eSetValueWithOverwrite );/* 服务器连接状态,LED闪烁为300mS一次. */
            while(1)
            {
                if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
                {
                    err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf),NETCONN_COPY); //发送tcp_server_sentbuf中的数据
                    if(err != ERR_OK)
                    {
                        log_i("发送失败\r\n");
                    }
                    tcp_client_flag &= ~LWIP_SEND_DATA;
                }
                    
                if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)  //接收到数据
                {   
                    taskENTER_CRITICAL(); //关中断
                    memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
                    for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
                    {
                        //判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
                        //的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
                        if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
                        else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
                        data_len += q->len;      
                        if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出   
                    }
                    taskEXIT_CRITICAL();  //开中断
                    data_len=0;  //复制完成后data_len要清零。   
                    log_i("TCP recdata sucess:");                    
                    printf("%s\r\n",tcp_client_recvbuf);
                    tcp_client_sendbuf = tcp_client_recvbuf;
                    tcp_client_flag |= LWIP_SEND_DATA;
                    netbuf_delete(recvbuf);
                }else if(recv_err == ERR_CLSD)  //关闭连接
                {
                    netconn_close(tcp_clientconn);
                    netconn_delete(tcp_clientconn);
                    xTaskNotify( LedTaskHandle, 1000, eSetValueWithOverwrite );/* 服务器连接状态,LED闪烁为300mS一次. */
                    log_i("err:Can not link Server.");
                    break;
                }
                else if(recv_err != ERR_TIMEOUT)
                {
                    log_i("%d\r\n",recv_err);//断掉服务器后总是出现ERR_CONN再也连接不上了
                    vTaskDelay(1000);
                }
            }
        }



1.png

最佳答案

查看完整内容[请看2#楼]

服务器在一段时间内没有与客户端通信的话,会把客户端踢掉的,这时需要板子重启才可以连接了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3583
金钱
3583
注册时间
2019-8-14
在线时间
1052 小时
发表于 2021-4-15 15:28:20 | 显示全部楼层
服务器在一段时间内没有与客户端通信的话,会把客户端踢掉的,这时需要板子重启才可以连接了
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2019-9-13
在线时间
58 小时
 楼主| 发表于 2021-4-15 15:59:50 | 显示全部楼层
自己顶
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2024-7-11
在线时间
3 小时
发表于 2024-7-11 16:58:51 | 显示全部楼层
老哥解决了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 13:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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