OpenEdv-开源电子网

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

LWIP TCP连接求助

[复制链接]

9

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2016-4-30
在线时间
52 小时
发表于 2019-1-10 11:18:35 | 显示全部楼层 |阅读模式
1金钱
参考原子哥的网络通信LWIP例程,但是我出现了一个问题, 创建一个TCP client后,连接电脑端的TCP server是可以正常连接的,server给client发数据,client也能收到,但是当加入 tcp_client_usersent(tcppcb);    //用户发送数据   这行代码后,client始终连接不上server了,注释掉这行代码就又可以了,单步调试的时候发现,在tcp_client_usersent(tcppcb);    函数中 es=tpcb->callback_arg;这一项始终为0,进而发现 tcp_client_connected 这个函数没有执行,也就是TCP client根本没有创建成功

请给位老大帮忙分析一下,这是为何啊?我觉得 tcp_client_usersent(tcppcb);  在tcp client创建之前根本就不会执行,也就是不影响tcp client向tcp server的连接,但是为什么我把tcp_client_usersent(tcppcb);  注释掉就能连接server,添加上就连接不了了

//lwIP TCP连接建立后调用回调函数
err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
        struct tcp_client_struct *es=NULL;  
        if(err==ERR_OK)   
        {
                es=(struct tcp_client_struct*)mem_malloc(sizeof(struct tcp_client_struct));  //申请内存
                if(es) //内存申请成功
                {
                        es->state=ES_TCPCLIENT_CONNECTED;//状态为连接成功
                        es->pcb=tpcb;  
                        es->p=NULL;
                        tcp_arg(tpcb,es);                                //使用es更新tpcb的callback_arg
                        tcp_recv(tpcb,tcp_client_recv);          //初始化LwIP的tcp_recv回调功能   
                        tcp_err(tpcb,tcp_client_error);         //初始化tcp_err()回调函数
                        tcp_sent(tpcb,tcp_client_sent);                //初始化LwIP的tcp_sent回调功能
                        tcp_poll(tpcb,tcp_client_poll,1);         //初始化LwIP的tcp_poll回调功能
                        tcp_client_flag|=1<<5;                                 //标记连接到服务器了
                        err=ERR_OK;
                }else
                {
                        tcp_client_connection_close(tpcb,es);//关闭连接
                        err=ERR_MEM;        //返回内存分配错误
                }
        }else
        {
                tcp_client_connection_close(tpcb,0);//关闭连接
        }
        return err;
}


//LWIP数据发送,用户应用程序调用此函数来发送数据
//tpcb:TCP控制块
//返回值:0,成功;其他,失败
err_t tcp_client_usersent(struct tcp_pcb *tpcb)
{
    err_t ret_err;
        struct tcp_client_struct *es;
        es=tpcb->callback_arg;
        if(es!=NULL)  //连接处于空闲可以发送数据
        {
        es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)tcp_client_sendbuf),PBUF_POOL);        //申请内存
        pbuf_take(es->p,(char*)tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf));        //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中
        tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去
        tcp_client_flag&=~(1<<7);        //清除数据发送标志
        if(es->p)pbuf_free(es->p);        //释放内存
                ret_err=ERR_OK;
        }else
        {
                tcp_abort(tpcb);//终止连接,删除pcb控制块
                ret_err=ERR_ABRT;
        }
        return ret_err;
}



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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 12:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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