diff --git a/components/net/lwip/apps/netio.c b/components/net/lwip/apps/netio.c index 48d016bf7bb82ccb08a4445ea3c386e2bcefe1d8..0466cc5f6d1fc2a1bb5e4c36894ad19ae2af8ca1 100644 --- a/components/net/lwip/apps/netio.c +++ b/components/net/lwip/apps/netio.c @@ -183,6 +183,7 @@ netio_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) } } else if (ns->state == NETIO_STATE_RECV_DATA) { + int chunk_length; if(ns->cntr == 0){ /* save the first byte of this new round of data @@ -191,13 +192,18 @@ netio_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) */ ns->first_byte = *data_ptr; } - - ns->buf_ptr[ns->buf_pos++] = *data_ptr++; - ns->cntr++; - - if (ns->buf_pos == NETIO_BUF_SIZE) { + + if (ns->cntr + (data_cntr + 1) < ns->data_len) chunk_length = data_cntr + 1; + else chunk_length = (ns->data_len - ns->cntr); + + ns->buf_pos += chunk_length; + data_ptr += chunk_length; + ns->cntr += chunk_length; + data_cntr -= (chunk_length - 1); + + if (ns->buf_pos >= NETIO_BUF_SIZE) { /* circularize the buffer */ - ns->buf_pos = 0; + ns->buf_pos %= NETIO_BUF_SIZE; } if(ns->cntr == ns->data_len){