LWIP TCP连接求助

2019-07-20 04:15发布

参考原子哥的网络通信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;
}



0条回答

一周热门 更多>