lwip tcp_client发送数据必须放在tcp_client_poll()这个回调函数里吗?
原子给的例程
[mw_shl_code=c,true]err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
err_t ret_err;
struct tcp_client_struct *es;
es=(struct tcp_client_struct*)arg;
if(es!=NULL) //连接处于空闲可以发送数据
{
if(tcp_client_flag&(1<<7)) //判断是否有数据要发送
{
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); //释放内存
}else if(es->state==ES_TCPCLIENT_CLOSING)
{
tcp_client_connection_close(tpcb,es);//关闭TCP连接
}
ret_err=ERR_OK;
}else
{
tcp_abort(tpcb);//终止连接,删除pcb控制块
ret_err=ERR_ABRT;
}
return ret_err;
} [/mw_shl_code]
但是要发送一个很大数据,就出现问题,数据末尾发送的全是00000000000
jpeg_data_buf大概有120K,发送到20k左尾发送的就全是0
我改的代码
jpeg_data_buf的长度等于IMAGEBUFLOOP*1024+IMAGEBUFLOOP
[mw_shl_code=c,true]//lwIP tcp_poll的回调函数
err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
err_t ret_err;
struct tcp_client_struct *es;
u16 image_send_count; // 循环发送次数
es=(struct tcp_client_struct*)arg;
if(es!=NULL) //连接处于空闲可以发送数据
{
if(tcp_client_flag&(1<<7)) //判断是否有数据要发送
{
tcp_client_flag&=~(1<<7); //清除数据发送标志
for(image_send_count = 0; image_send_count < IMAGEBUFLOOP; image_send_count++)
{
delay_ms(3); // 防止发送过快导致收不到ACK
// lwip_periodic_handle();
es->p=pbuf_alloc(PBUF_TRANSPORT, 1024,PBUF_POOL); //申请内存
pbuf_take(es->p,(char*)(jpeg_data_buf+image_send_count*1024),1024); //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中
tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去
if(es->p)pbuf_free(es->p); //释放内存
}
if(IMAGEBUFLEFT) // jpeg_data_buf 不为1K的整数倍
{
delay_ms(3);
// lwip_periodic_handle();
es->p=pbuf_alloc(PBUF_TRANSPORT, IMAGEBUFLEFT,PBUF_POOL); //申请内存
pbuf_take(es->p,(char*)(jpeg_data_buf+image_send_count*1024),IMAGEBUFLEFT); //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中
tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去
if(es->p)pbuf_free(es->p); //释放内存
}
}else if(es->state==ES_TCPCLIENT_CLOSING)
{
tcp_client_connection_close(tpcb,es);//关闭TCP连接
}
IMAGESENDOK=1; // 标记数据发送完成
ret_err=ERR_OK;
}else
{
tcp_abort(tpcb);//终止连接,删除pcb控制块
ret_err=ERR_ABRT;
}
return ret_err;
} [/mw_shl_code]
我想问的是这是什么原因?有没有可能将发送函数独立出来?如果可以应该怎么做? |