Exemplo n.º 1
0
//服务器接收到数据之后将要调用的函数
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;
	
}
Exemplo n.º 2
0
static int tcp_server_gc(lua_State *l)
{
    return tcp_server_close(l);
}