LWIP 断开服务器

2019-07-20 05:29发布

LWIP 断开服务器: LWIP无法正常断开服务器链接;
//////////////////////////////////////////////////////////////////..
目前遇到须要手动删除服务器链接, 虽然目前能断开,并完全清除, 重连正常, 但只能操作5次, 就再也连不上了, 目测问题出在监听段, 于是禁用链接获取段的阻塞功能, 虽然问题解决, 但重试次数仅5次, 所以据我猜测, 问题出在监听上, 可能监听没有正常关闭所致, 但苦于没有办法, 于是来请教原子和各位网友
///////////////////////////////////////////////////////////////////..

                netconn_close(server_conn);                 //关闭服务器链接
                netconn_delete(server_conn);                //失败,删除服务器链接
                TCP_Server_Clear_TimeWait();                //强制删除 timewait pcb块
        }else printf(" server_conn链接创建失败 ");
        NetCamera_CloseFLAG=0;                      //已关闭,清除请求
        while(1)OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&os_err); //网络摄像头进入关闭态

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
萌萌的小x盆友
2019-07-20 09:31
/******************************************************************************/
//网络摄像头任务

void NetCamera_Task(void *arg)
{
  OS_ERR  os_err;
        err_t   lwip_err;
        u8      res=0;
        struct netconn *tcp_conn;
        struct netconn *server_conn;
        ip_addr_t ipaddr;
        u16    port;
        u32 *tbuf;
        CPU_SR_ALLOC();
       
        LWIP_UNUSED_ARG(arg);
       
        NetCamera_CloseFLAG=0;                  //初始化标志;
        server_conn=netconn_new(NETCONN_TCP);   //创建 netconn_tcp服务器链接
        netconn_bind(server_conn,IP_ADDR_ANY,8080); //将本机IP,端口绑定至服务器链接
        lwip_err=netconn_listen(server_conn);   //服务器进入监听状态
        if(lwip_err==ERR_OK)
        {
          while(NetCamera_CloseFLAG==0)         //如果收到请求,自动关闭
                {
                        server_conn->recv_timeout =10;      //10ms,设置监听超时,防止阻塞线程
                        lwip_err=netconn_accept(server_conn,&tcp_conn); //获取服务器监听到的链接
                        server_conn->recv_timeout =0;       //取消超时,永不超时
                        if(lwip_err==ERR_OK)
                        {
                          netconn_getaddr(tcp_conn,&ipaddr,&port,0); //获取IP,端口号(远端)
                                printf(" 远程客户端: IP: %d.%d.%d.%d Port: %04d已连接! ",ip4_addr1(&ipaddr),ip4_addr2(&ipaddr),ip4_addr3(&ipaddr),ip4_addr4(&ipaddr),port); //打印远端IP,端口号
                                NetCamera_Init();                  //初始化网络摄像头
                                delay_ms(1000);                    //延时100ms,必须延时
                                while(1)
                                {
OS_CRITICAL_ENTER();
                                  res=netcam_fifo_read(&tbuf);         //将NetCamera数据读入FIFO
OS_CRITICAL_EXIT();
                                        if(res)                    //读取到数据
                                        {
                                          lwip_err=netconn_write(tcp_conn,tbuf,NETCAM_LINE_SIZE*4,NETCONN_COPY); //netconn发送数据(复制)
                                        }else  lwip_err=netconn_err(tcp_conn); //获取netconn_err
                                        if(lwip_err==ERR_CLSD||lwip_err==ERR_RST||NetCamera_CloseFLAG)
                                        {
                                                NetCamera_DeInit();                  //关闭NetCamera摄像头
                                                netconn_close(tcp_conn);             //关闭netconn链接
                                                netconn_delete(tcp_conn);            //删除tcp_conn链接
                                                printf(" 断开链接: IP: %d.%d.%d.%d; ",ip4_addr1(&ipaddr),ip4_addr2(&ipaddr),ip4_addr3(&ipaddr),ip4_addr4(&ipaddr));
                                                break;                           //跳出
                                        }
                                        OSTimeDlyHMSM(0,0,0,2,OS_OPT_TIME_HMSM_STRICT,&os_err); //周期2ms
                                }
                        }
                        OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&os_err); //200ms
                }
                netconn_close(server_conn);                 //关闭服务器链接
                netconn_delete(server_conn);                //失败,删除服务器链接
                TCP_Server_Clear_TimeWait();                //强制删除 timewait pcb块
        }else printf(" server_conn链接创建失败: %d ",lwip_err);
        NetCamera_CloseFLAG=0;                        //已关闭,清除请求
        while(1)OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&os_err); //网络摄像头进入关闭态
}
/******************************************************************************/

一周热门 更多>