简单的介绍下使用流程函数名只做演示用

代码来自于LWIP编程指南

一,作为客户端

网卡初始化

mac地址设置,自己的ip,子网掩码,网关设置

lwIPInit(MAC, local_ip, local_mask,local_gateway, IPADDR_USE_STATIC);

设置服务器ip  IP4_ADDR(&ipaddr,192,168,1,120);//server ip

连接服务器

tcp_new()

tcp_bind()

tcp_connect()  注意:这一步要注册连接成功的回调函数,在函数中可设置标志来标志连接成功

tcp_recv            注意:这一步要注册接收用的回调函数  一旦有数据接收就会调用在这里注册的回调函数

tcp_write

tcp_close()

const static uint8 TCP_TestData []="This is LwIP TCP Client  在Luminary Cortex-M3 上的测试!\r\n"; 
 void TCP_Client_Init(); 
  
 void  Delay(unsigned long  ulVal)                          /*  利用循环产生一定的延时         */ 
 { 
     while ( --ulVal  !=  0 ); 
 } 
  
 int main() 
 { 
   targetInit(); 
 
   InitNic(); 
   
   while(1) 
   { 
     TCP_Client_Init(); 
     Delay(1000000UL);   
     Delay(1000000UL);  
     Delay(1000000UL);  
    } 
 } 
  
 /*******  这是一个回调函数,当TCP 客户端请求的连接建立时被调用********/ 
 err_t TcpCli_Connected(void *arg ,struct tcp_pcb *pcb,err_t err) 
 { 
    tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData),0);       /*   发送数据                        */ 
     
    tcp_close(pcb); 
     
    return ERR_OK; 
 } 
  
 void TCP_Client_Init() 
 { 
   struct tcp_pcb *Clipcb; 
   struct ip_addr ipaddr; 
    
   IP4_ADDR(&ipaddr,192,168,1,16); 
    
   Clipcb = tcp_new();                                     /*  建立通信的TCP 控制块(Clipcb)    */ 
   tcp_bind(Clipcb,IP_ADDR_ANY,1026);                    /*   绑定本地IP 地址和端口号         */ 
    
   tcp_connect(Clipcb,&ipaddr,1026,TcpCli_Connected); 
 }


二,作为服务器端

tcp_new

tcp_bind

tcp_listen

tcp_accpet(回调函数地址)    注意:在这里注册有连接后的回调函数,有连接时就会调用注册的回调函数


回调函数中:

tcp_setprio

tcp_recv

tcp_write

pbuf_free


/*************************TCP 测试的WEB服务器建立网页与服务器声明***********************/ 
 const static uint8 indexdata[]="<html>\ 
                          <head><title>广州致远电子</title></head>\ 
                          <body>\ 
                            这里是LwIP TCP在Luminary Cortex-M3 上的测试!\ 
                          </body>\ 
                          </html>"; 
 const static uint8 http_html_hdr []="HTTP/1.1  200 OK\r\nContent-type: text/html\r\n\r\n"; 
  
 /*******************  这是一个回调函数,当一个TCP 段到达这个连接时会被调用*****************/ 
 static err_t http_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err) 
 { 
   if(p != NULL) 
  { 
     tcp_write(pcb,http_html_hdr,sizeof(htt p_html_hdr),0);             /*  发送http 协议头部信息      */ 
     tcp_write(pcb,indexdata,sizeof(indexdata),0);                    /*  发送http 网页信息          */ 
      
     pbuf_free(p);                                              /*  释放该TCP 段             */ 
  } 
   tcp_close(pcb);                                              /* 关闭这个连接              */ 
   err = ERR_OK; 
   return err; 
 } 
  
 /********************** 这是一个回调函数,当一个连接已经接受时会被调用**********************/ 
 static err_t http_accept(void *arg,struct tcp_pcb *pcb,err_t err) 
 { 
   tcp_setprio(pcb, TCP_PRIO_MIN);                              /*   设置回调函数优先级,当   */ 
                                                             /*   存在几个连接时特别重要,  */ 
 /*   此函数必须调用*/ 
   tcp_recv(pcb,http_recv);                                      /*   设置TCP 段到时的回调函数 */ 
     
   err = ERR_OK; 
 return err; 
 } 
 void http_init(void) 
 { 
   struct tcp_pcb *pcb; 
    
   pcb = tcp_new();                                          /*  建立通信的TCP 控制块(pcb)    */ 
   tcp_bind(pcb,IP_ADDR_ANY,80);                           /*  绑定本地IP 地址和端口号      */ 
   pcb = tcp_listen(pcb);                                      /*  进入监听状态                 */ 
   tcp_accept(pcb,http_accept);                                /*  设置有连接请求时的回调函数   */ 
 } 
  
 int main() 
 { 
   targetInit(); 
   InitNic(); 
   
   http_init(); 
   while(1) 
   { 
     ; 
   } 
 }



httpd实例


//*****************************************************************************
 //!
 //! 这个函数是当有数据传送到控制器时会被调用。
 //! 
 //*****************************************************************************
 static err_t http_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
 {
 	char RecivePcBuf[1600];
 //	 	unsigned char FROK;
 	tcp_recved(pcb,p->len);	
 	strcpy(RecivePcBuf,p->payload);
 	if(p != NULL)
 	{
 		
 	tcp_write(pcb,p->payload,p->len,1);
 		        
 	}
 	pbuf_free(p); /* 释放该TCP段 */
 	 											  
 //	tcp_close(pcb); /* 关闭这个连接 */
 	err = ERR_OK;
 	return err;
 }
 
 //*****************************************************************************
 //!
 //! This is a call back servic function ,when a connection was accepet this 
 //! function will be called .
 //! 
 //*****************************************************************************
 static err_t http_accept(void *arg,struct tcp_pcb *pcb,err_t err)
 {
 	//
 	// 设置回调函数优先级,当存在几个连接时特别重要,此函数必须调用
 	//
 	tcp_setprio(pcb, TCP_PRIO_NORMAL);
 	//
 	// 设置TCP段到时的回调函数
 	//
 	tcp_recv(pcb,http_recv);
 	err = ERR_OK;
 	return err;
 }
 //*****************************************************************************
 //!
 //! This is the data dealwith function
 //! 
 //*****************************************************************************
 
 
 //*****************************************************************************
 //!
 //! Initial the TCP server
 //! 
 //*****************************************************************************
 
 void http_init(void)
 { 
 
 	//
 	// 建立通信的TCP控制块(pcb)
 	//
 	pcbs = tcp_new();
 	//
 	// 绑定本地IP地址和端口号
 	//
 	tcp_bind(pcbs,IP_ADDR_ANY,1024); 
 	//
 	//  进入监听状态
 	//
 	pcbs = tcp_listen(pcbs); 
 	//
 	// 设置有连接请求时的回调函数
 	//
 	tcp_accept(pcbs,http_accept);
 }


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐