Lwip的TCP编程

#define TCP_CLIENT_PORT 8087
struct netif lwip_netif; //定义一个全局的网络接口
int main(void)
{
	struct netif *Netif_Init_Flag;
	struct ip_addr ipaddr; 		//ip地址
	struct ip_addr netmask; 	//子网掩码
	struct ip_addr gw; 			//默认网关
	struct tcp_pcb *tcppcb;  	//定义一个TCP服务器控制块
	struct ip_addr rmtipaddr; //远端ip地址
	
	lwip_init();
	
	IP4_ADDR(&ipaddr,192,168,1,xxx);			//设置本机IP
	IP4_ADDR(&netmask,255,255,255,0);
	IP4_ADDR(&gw,192,168,1,1);
	Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,ðernet_input);  //添加网口
	
	#ifdef DHCP
	dhcp_start(&lwip_netif);	
	#endif /*DHCP*/
	
	netif_set_default(&lwip_netif); 	//设置netif为默认网口
	netif_set_up(&lwip_netif);			//打开netif网口
	
	tcppcb=tcp_new();						//创建一个新的pcb
	IP4_ADDR(&rmtipaddr, xxx, xxx, xxx, xxx);	//设置远端IP地址 
	tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);  //连接致远端主机,接成功后回调 tcp_client_connected(用户实现)
	
	while(1)
	{
		LwipPriodTask();	//Lwip周期处理任务
	}
}


void LwipPriodTask(void)
{// Lwip周期处理任务
//如果使用tcp,每250ms调用一次tcp_tmr()函数
tcp_tmr();

  	//每5s周期性调用一次ARP
   	etharp_tmr();
  
	//如果使用DHCP
    dhcp_fine_tmr();			//  1)每500ms调用一次dhcp_fine_tmr()
	dhcp_coarse_tmr();		//  2)每60s执行一次DHCP粗糙处理


}


//lwIP TCP连接建立后调用回调函数
err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
	struct tcp_client_struct *es=NULL;  
	if(err==ERR_OK)   
	{
		es=(struct tcp_client_struct*)mem_malloc(sizeof(struct tcp_client_struct));  //申请内存
		if(es) //内存申请成功
		{
 			es->state=ES_TCPCLIENT_CONNECTED;//状态为连接成功
			es->pcb=tpcb;  
			es->p=NULL; 
			tcp_arg(tpcb,es);        					//使用es更新tpcb的callback_arg
			tcp_recv(tpcb,tcp_client_recv);  	//初始化LwIP的tcp_recv回调功能   
			tcp_err(tpcb,tcp_client_error); 	//初始化tcp_err()回调函数
			tcp_sent(tpcb,tcp_client_sent);	//初始化LwIP的tcp_sent回调功能
			tcp_poll(tpcb,tcp_client_poll,1); 	//初始化LwIP的tcp_poll回调功能 
			
			err=ERR_OK;
		}
		else
		{ 
			tcp_abort(tpcb);//终止连接,删除pcb控制块
			tcp_arg(tpcb,NULL);  
			tcp_recv(tpcb,NULL);
			tcp_sent(tpcb,NULL);
			tcp_err(tpcb,NULL);
			tcp_poll(tpcb,NULL,0);  
			mem_free(es);
			err=ERR_MEM;	//返回内存分配错误
		}
	}
	else
	{
		tcp_abort(tpcb);//终止连接,删除pcb控制块
		tcp_arg(tpcb,NULL);  
		tcp_recv(tpcb,NULL);
		tcp_sent(tpcb,NULL);
		tcp_err(tpcb,NULL);
		tcp_poll(tpcb,NULL,0);  
		mem_free(es);
	}
	return err;
}

你可能感兴趣的:(Lwip的TCP编程)