static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)

{

char HeartDatSend[5] = {0x01,0x02,0x03,0x04,0x05};

#ifdef SERIAL_DEBUG

char *recdata=0;

#endif

struct pbuf *spbuf;

struct tcp_echoserver_struct *es;

err_t ret_err;

LWIP_ASSERT("arg != NULL",arg != NULL);

es = (struct tcp_echoserver_struct *)arg;

/* if we receive an empty tcp frame from client => close connection */

if (p == NULL)

{

/* remote host closed connection */

es->state = ES_CLOSING;

if(es->p == NULL)

{

/* we're done sending, close connection */

tcp_echoserver_connection_close(tpcb, es);

}

else

{

/* we're not done yet */

/* acknowledge received packet */

tcp_sent(tpcb, tcp_echoserver_sent);

/* send remaining data*/

tcp_echoserver_send(tpcb, es);

}

ret_err = ERR_OK;

}

/* else : a non empty frame was received from client but for some reason err != ERR_OK */

else if(err != ERR_OK)

{

/* free received pbuf*/

es->p = NULL;

pbuf_free(p);

ret_err = err;

}

else if(es->state == ES_ACCEPTED)

{

/* first data chunk in p->payload */

es->state = ES_RECEIVED;

/* store reference to incoming pbuf (chain) */

es->p = p;

/* initialize LwIP tcp_sent callback function */

tcp_sent(tpcb, tcp_echoserver_sent);

#ifdef SERIAL_DEBUG

recdata=(char *)malloc(p->len*sizeof(char));

if(recdata!=NULL)

{

memcpy(recdata,p->payload,p->len);

printf("upd_rec:%s",recdata);

}

free(recdata);

#endif

/* send back the received data (echo) */

tcp_echoserver_send(tpcb, es);

ret_err = ERR_OK;

}

else if (es->state == ES_RECEIVED)

{

/* more data received from client and previous data has been already sent*/

if(es->p == NULL)

{

es->p = p;

#ifdef SERIAL_DEBUG

recdata=(char *)malloc(p->len*sizeof(char));

if(recdata!=NULL)

{

memcpy(recdata,p->payload,p->len);

printf("upd_rec:%s",recdata);

}

free(recdata);

#endif

spbuf = pbuf_alloc(PBUF_TRANSPORT,256,PBUF_RAM);//开一个新缓冲

spbuf->payload = HeartDatSend;//装载数据

spbuf->len = sizeof(HeartDatSend)/sizeof(HeartDatSend[0]);//设置发送长度

spbuf->tot_len = sizeof(HeartDatSend)/sizeof(HeartDatSend[0]);//设备总长度

es->p = spbuf;//将缓冲更新到要发送PCB中

/* send back received data */

tcp_echoserver_send(tpcb, es);//发送

// tcp_echoserver_send(es->pcb, es);

pbuf_free(spbuf);//释放缓冲区

}

else

{

struct pbuf *ptr;

/* chain pbufs to the end of what we recv'ed previously  */

ptr = es->p;

pbuf_chain(ptr,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 */

es->p = NULL;

pbuf_free(p);

ret_err = ERR_OK;

}

return ret_err;

}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐