基于lwip协议,实现从服务器上拉取数据进行接收保存,由于数据量比较大,所以不能一次接收,只能分开接收,每次接收1460字节数据,接收完成进行合并,主要处理分为两点:
- 修改lwip配置代码lwipopts.h文件中#define PBUF_POOL_BUFSIZE宏定义修改大一点,比如1024;
- 由于动态分配堆栈空间有限,所以直接定义char recev_buf[1500]和static char recdata[10000]用于接收,每次接收数据暂存在recev_buf,接收完成后追加到recdata中进行保存;
附上部分代码:
/**
* 函数功能: TCP接收数据回调函数
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
static err_t tcp_echoclient_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
struct echoclient *es;
err_t ret_err;
struct pbuf *q;
LWIP_ASSERT("arg != NULL",arg != NULL);
es = (struct echoclient *)arg;
/* if we receive an empty tcp frame from server => close connection */
if (p == NULL)
{
/* remote host closed connection */
es->state = ES_CLOSING;
if(es->p_tx == NULL)
{
/* we're done sending, close connection */
tcp_echoclient_connection_close(tpcb, es);
}
else
{
/* send remaining data*/
tcp_echoclient_send(tpcb, es);
}
ret_err = ERR_OK;
}
/* else : a non empty frame was received from echo server but for some reason err != ERR_OK */
else if(err != ERR_OK)
{
/* free received pbuf*/
if (p != NULL)
{
pbuf_free(p);
}
ret_err = err;
}
else if(es->state == ES_CONNECTED)
{
/* increment message count */
message_count++;
/* Acknowledge data reception */
tcp_recved(tpcb, p->tot_len);
l = p->payload;
l = l + p->len;
*l = '\0';
printf("%s",p->payload);
strcpy(recev_buf,p->payload);
q = p;
while(q->next != NULL)
{
q = q->next;
tcp_recved(tpcb, q->tot_len);
l = q->payload;
l = l + q->len;
*l = '\0';
printf("%s",q->payload);
strcat(recev_buf,q->payload);
}
pbuf_free(p);
ret_err = ERR_OK;
}
/* data received when connection already closed */
else
{
/* Acknowledge data reception */
tcp_recved(tpcb, p->tot_len);
/* free pbuf and do nothing */
pbuf_free(p);
ret_err = ERR_OK;
}
if(flag)
{
strcat(recdata,recev_buf);
}
else
{
strcpy(recdata,recev_buf);
}
//还有数据待接收
if(strlen(recev_buf) == 1460)
{
flag = 1;
}
else//接收完成
{
flag = 0;
}
return ret_err;
}