uip架构和局限

怎么了解uip

可以看看uip.h。里面有使用函数的说明和例程。

uip_polling在main-while 中调用
check(uip_len>0 ) 有网络数据后,处理事件。uip_polling定义了这些功能,uip才会有相应的功能。
处理哪些事件。如

 UIP_ETHTYPE_IP	               \                            /-> udp_app   用户程序
 UIP_ETHTYPE_ARP			    |--uip_process核心调用处理---|->tcp_app
 定时检测UDP/TCP通讯事件          |                           |->tcp连接处理
 uip_udp_periodic/轮询用户app	/                            \->数据录入

UDP用户代码

初始化
void udp_app_init(void)
{
 uip_ipaddr_t addr;
 struct uip_udp_conn *c;
 
  uip_ipaddr(&addr, 192,168,0,132);
  c = uip_udp_new(&addr, HTONS(UDP_TEST_PORT));  //remote port
  if(c != NULL) {
   uip_udp_bind(c, HTONS(UDP_TEST_PORT));        //local port
  }
}

------------------------------------------------------------------------------------
void udp_appcall(void)
{   
	switch(uip_udp_conn->lport)
	{
		case HTONS(UDP_TEST_PORT):
      		udp_test_app(uip_appdata);     
			break;
		default:						  
		    break;
	}	  
}

BB几句

  1. uip里有很多全局变量,用起来有点头大。有时根本不知道他用来干嘛的,几个差不多的变量经常搞混

     例如:
     1网口的接口代码,也是用的uip_len和uip_buf这种全局变量
     void tapdev_send(void)
     {
     	ENC28J60_Packet_Send(uip_len,uip_buf);
     }
     2 检查网络事件
     if(uip_len>0)
    
  2. 代码风格也不怎么好

     uip_process里还很多goto
       if(flag == UIP_UDP_SEND_CONN) {
         goto udp_send;
       }
    

UDP使用限制

只能单工模式:发送和接收数据共用一个buff,在接收函数里甚至不能回送接收信息

官方例程unix节选
unsigned int
tapdev_read(void)
{
  int ret;	  
  ret = read(fd, uip_buf, UIP_BUFSIZE);
  return ret;
}
/*---------------------------------------------------------------------------*/
void	tapdev_send(void)
{
  int ret;
  ret = write(fd, uip_buf, uip_len);
}

	void udp_receive_app(char * p)
	{
	  if(uip_newdata())
	  {
	     memcpy((char *)udp_send_databuf,uip_appdata,UIP_APPDATA_SIZE);
	     uip_send(udp_send_databuf,UIP_APPDATA_SIZE);  
	  }
	}
	这样数据是不会发送出来的,而且发送几条后uip就会停止udp服务 

只要不动uip_appdata,这样是可以的(原因我也不清楚,很纳闷,uip还是)
void udp_test_app(char * p)
{
  if(uip_newdata())
  {
     strcpy((char *)udp_send_databuf,"good news \n");
     uip_send(udp_send_databuf,11);  
     //或者直接	uip_send("good news \n",11);       
  }
}	

UDP的接收app里,没有特殊处理,只能发送一条数据。
因为uip_send()只是把数据放入buf,然后通过在uip_polling()中轮询发送。所以连续多条uip_send()时只发送最后那条。如

	uip_send("this is a good news! \n",22);
	uip_send("this is a bad news! \n",21);
	就只发送后面一条

主要函数说明

  1. uip_polling()
    放在main主循环里的用户函数,通过不同事件调用uip_process()

  2. uip_process()

     uip_process()都是通过类似定义来引用
     #define uip_input()        uip_process(UIP_DATA)
    
      uip_polling都是通过以下函数来引用uip_process(),包括
      
      uip_input()                    接收包处理
      uip_periodic(conn)		     TCP连接周期性处理
      uip_periodic_conn(conn)        制定TCP连接处理
      uip_poll_conn(conn)            轮询特定连接
      uip_udp_periodic(conn)         UDP周期性处理
      uip_udp_periodic_conn(conn)    特定UDP周期性处理
    

你可能感兴趣的:(嵌入式开发)