//服务器接收到数据之后将要调用的函数 err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err){ err_t ret_err; struct tcp_server_state* ts; ts = arg; //TCP PCB状态 if(p==NULL){ ts->state = ES_CLOSING; //连接关闭了 tcp_server_close(tpcb,ts); lwip_flag &=~ LWIP_CONNECTED; //清除连接标志 }else if(err!=ERR_OK){ //未知错误,释放pbuf if(p!=NULL){ pbuf_free(p); } ret_err = err; //得到错误 }else if(ts->state==ES_RECEIVED){//连接收到了新的数据 // printf("服务器新接收的数据:%s\r\n",p->payload); if((p->tot_len)>=LWIP_DEMO_BUF){ //如果收的的数据大于缓存 ((char*)p->payload)[199] = 0; memcpy(lwip_demo_buf,p->payload,200); }else{ memcpy(lwip_demo_buf,p->payload,p->tot_len); lwip_demo_buf[p->tot_len] = 0; } lwip_flag |= LWIP_NEW_DATA; //收到了新的数据 tcp_recved(tpcb, p->tot_len); //用于获取接收数据的长度, 通知LWIP已经读取了数据,可以获取更多的数据 pbuf_free(p); //释放内存 ret_err = ERR_OK; }else if(ts->state==ES_CLOSING){ //服务器关闭了 tcp_recved(tpcb, p->tot_len); //远程端口关闭两次,垃圾数据 pbuf_free(p); ret_err = ERR_OK; }else{ //其他未知状态 tcp_recved(tpcb, p->tot_len); pbuf_free(p); ret_err = ERR_OK; } return ret_err; }
static int tcp_server_gc(lua_State *l) { return tcp_server_close(l); }