#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;
}