OpenEdv-开源电子网

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

LWIP 断开服务器

[复制链接]

2

主题

18

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-10-14
在线时间
5 小时
发表于 2018-10-27 21:45:44 | 显示全部楼层 |阅读模式
1金钱
LWIP 断开服务器: LWIP无法正常断开服务器链接;
//////////////////////////////////////////////////////////////////..
目前遇到须要手动删除服务器链接, 虽然目前能断开,并完全清除, 重连正常, 但只能操作5次, 就再也连不上了, 目测问题出在监听段, 于是禁用链接获取段的阻塞功能, 虽然问题解决, 但重试次数仅5次, 所以据我猜测, 问题出在监听上, 可能监听没有正常关闭所致, 但苦于没有办法, 于是来请教原子和各位网友
///////////////////////////////////////////////////////////////////..

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

最佳答案

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

/******************************************************************************/ //网络摄像头任务 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; //初始化标 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-10-14
在线时间
5 小时
 楼主| 发表于 2018-10-27 21:45:45 | 显示全部楼层
/******************************************************************************/
//网络摄像头任务

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("\r\n远程客户端: IP: %d.%d.%d.%d Port: %04d已连接!\r\n",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("\r\n断开链接: IP: %d.%d.%d.%d;\r\n",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("\r\nserver_conn链接创建失败: %d\r\n",lwip_err);
        NetCamera_CloseFLAG=0;                        //已关闭,清除请求
        while(1)OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&os_err); //网络摄像头进入关闭态
}
/******************************************************************************/
回复

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-10-14
在线时间
5 小时
 楼主| 发表于 2018-10-27 22:01:42 | 显示全部楼层
回复

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-10-14
在线时间
5 小时
 楼主| 发表于 2018-10-27 22:07:13 | 显示全部楼层
然后一下错误状态, 无法连接之后, 此时无论怎么重连错误也无变化, (-3超时), 因为在监听时使用的是非阻塞, 故正确的错误为无错误, 并且一直在阻塞;
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-10-28 01:24:07 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-10-14
在线时间
5 小时
 楼主| 发表于 2018-10-28 13:17:36 | 显示全部楼层

谢谢原子哥, 我把 "opt.h", "lwip_opt.h"中与5,相关的找遍了都没找到, 话说设大点也能缓解一下
回复

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-10-14
在线时间
5 小时
 楼主| 发表于 2018-10-29 14:52:12 | 显示全部楼层
问题终于解决了, 现在可以正常关闭, 打开服务器, 没有Timewait; 下面附上代码
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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