OpenEdv-开源电子网

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

LWIP 做服务器,客户端连接问题

[复制链接]

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2018-1-12
在线时间
34 小时
发表于 2018-3-15 12:09:54 | 显示全部楼层 |阅读模式
你好,请问,我在移植LWIP做服务器的实验例程的程序到我的程序中时,第一次网络助手(客户端)可以连接成功,发送数据什么也都正常,随便怎么发都没问题;但是将网络助手(客户端)断开连接后就连接不上了;还有就是在不发数据前,客户端断开连接后是可以连接的。我debug调试时发现连接失败时出现创建一个新的pcb失败【tcppcb=tcp_new();】,请问客户端连接和发送数据有关?还是有其他什么问题?部分代码如下:
void tcp_server_test(u8 flag)
{
        err_t err;  
        struct tcp_pcb *tcppcb;          //定义一个TCP服务器控制块
        struct tcp_pcb *tcppcbconn;          //定义一个TCP服务器控制块
       
        u8 *tbuf;
        u8 key;
        u8 res=0;               
        u8 t=0;
        u8 connflag=0;                //连接标记
       
        if(flag == 0)
        {
                tbuf=mymalloc(SRAMIN,200);        //申请内存
                if(tbuf==NULL)return ;                //内存申请失败了,直接退出

                tcppcb=tcp_new();        //创建一个新的pcb
                if(tcppcb)                        //创建成功
                {
                        err=tcp_bind(tcppcb,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                        if(err==ERR_OK)        //绑定完成
                        {
                                tcppcbconn=tcp_listen(tcppcb);                         //设置tcppcb进入监听状态
                                tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                        }else res=1;  
                }else res=1;
                while(res==0)
                {
                        lwip_periodic_handle();
                        delay_ms(2);
                        t++;
                        if(t==200)
                        {
                                t=0;
                                if(connflag==0&&(tcp_server_flag&(1<<5))==0)//未连接上,则尝试重连
                                {
                                        tcp_server_connection_close(tcppcb,0);//关闭TCP Server连接
                                        tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接
                                        tcppcb=tcp_new();        //创建一个新的pcb
                                        if(tcppcb)                        //创建成功
                                        {
                                                err=tcp_bind(tcppcb,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                                                if(err==ERR_OK)        //绑定完成
                                                {
                                                        tcppcbconn=tcp_listen(tcppcb);                         //设置tcppcb进入监听状态
                                                        tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                                                        res=1;  
                                                }
                                        }
                                }
                               
                        }
                }
    }
        else
        {
                tcp_server_connection_close(tcppcb,0);//关闭TCP Server连接
                tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接
//                tcp_server_remove_timewait();  //强制删除TCP Server主动断开时的time wait
                memset(tcppcb,0,sizeof(struct tcp_pcb));
                memset(tcppcbconn,0,sizeof(struct tcp_pcb));
                myfree(SRAMIN,tbuf);
                flag = 0;
                tbuf=mymalloc(SRAMIN,200);        //申请内存
                if(tbuf==NULL)return ;                //内存申请失败了,直接退出
                tcppcb=tcp_new();        //创建一个新的pcb
                if(tcppcb)                        //创建成功
                {
                           err=tcp_bind(tcppcb,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                        if(err==ERR_OK)        //绑定完成
                        {
                                tcppcbconn=tcp_listen(tcppcb);                         //设置tcppcb进入监听状态
                                tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                        }else res=1;  
                }
        }
        myfree(SRAMIN,tbuf);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2018-3-15 17:24:09 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2018-1-12
在线时间
34 小时
 楼主| 发表于 2018-3-15 18:37:59 | 显示全部楼层
有没有大神知道问题所在,请指教。谢谢!!
回复 支持 反对

使用道具 举报

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2018-1-12
在线时间
34 小时
 楼主| 发表于 2018-3-24 22:13:19 | 显示全部楼层
void tcp_server_test(u8 flag)
{
        err_t err;  
        struct tcp_pcb *tcppcb;          //定义一个TCP服务器控制块
        struct tcp_pcb *tcppcbconn;          //定义一个TCP服务器控制块
        struct tcp_server_struct *tcppcb_es;          //定义一个TCP服务器控制块
       
        u8 *tbuf;
        u8 key;
        u8 res=0;               
        u8 t=0;
        u8 connflag=0;                //连接标记
       
        if(flag == 0)
        {
                tbuf=mymalloc(SRAMIN,200);        //申请内存
                if(tbuf==NULL)return ;                //内存申请失败了,直接退出

                tcppcb=tcp_new();        //创建一个新的pcb
                if(tcppcb)                        //创建成功
                {
                        err=tcp_bind(tcppcb,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                        if(err==ERR_OK)        //绑定完成
                        {
                                tcppcbconn=tcp_listen(tcppcb);                         //设置tcppcb进入监听状态
                                tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                        }
                        else res=1;  
                }
                else res=1;
                while(res==0)
                {
                        lwip_periodic_handle();
                        delay_ms(2);
                        t++;
                        if(t==200)
                        {
                                t=0;
                                if(connflag==0&&(tcp_server_flag&(1<<5))==0)//未连接上,则尝试重连
                                {
                                        tcp_server_connection_close(tcppcb,0);//关闭TCP Server连接
                                        tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接
                                        tcppcb=tcp_new();        //创建一个新的pcb
                                        if(tcppcb)                        //创建成功
                                        {
                                                err=tcp_bind(tcppcb,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                                                if(err==ERR_OK)        //绑定完成
                                                {
                                                        tcppcbconn=tcp_listen(tcppcb);                         //设置tcppcb进入监听状态
                                                        tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                                                        res=1;  
                                                }
                                        }
                                }
                               
                        }
                }               
                myfree(SRAMIN,tbuf);
    }
        else
        {

                tbuf=mymalloc(SRAMIN,200);        //申请内存
                if(tbuf==NULL)return ;                //内存申请失败了,直接退出
                tcppcb=tcp_new();        //创建一个新的pcb
                if(tcppcb)                        //创建成功
                {
                        err=tcp_bind(tcppcb,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                        if(err==ERR_OK)        //绑定完成
                        {
                                tcppcbconn=tcp_listen(tcppcb);                         //设置tcppcb进入监听状态
                                tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                        }

                }
                myfree(SRAMIN,tbuf);
        }
}



修改成这样后,客户端可以连接,也可以发送数据,但是lwip做服务器,但出现问题,在TCP.C中tcp_fasttmr函数会造成死循环了;
按照网上http://sunke9.spaces.eepw.com.cn/articles/article/item/126932 修改后,又死在tcp_input 中for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) ,这个for循环中啦   求大神指教
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 21:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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