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); //网络摄像头进入关闭态
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
//网络摄像头任务
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); //网络摄像头进入关闭态
}
/******************************************************************************/
一周热门 更多>