参考原子哥的网络通信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;
}
一周热门 更多>