uip代码之#define BUF ((struct uip_eth_hdr *)&uip_buf[0])

在看uip代码的时候有段代码觉得挺精彩的。
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
struct uip_eth_hdr {
  struct uip_eth_addr dest;
  struct uip_eth_addr src;
  u16_t type;
};

//处理IP数据包(只有校验通过的IP包才会被接收) 
if(BUF->type == htons(UIP_ETHTYPE_IP))//是否是IP包? 
{
uip_arp_ipin(); //去除以太网头结构,更新ARP表
uip_input();    //IP包处理
//当上面的函数执行后,如果需要发送数据,则全局变量 uip_len > 0
//需要发送的数据在uip_buf, 长度是uip_len  (这是2个全局变量)     
if(uip_len>0)//需要回应数据
{
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
}  
                
}

  BUF->type == htons(UIP_ETHTYPE_IP)     这个是把读取的数字转成数据结构。

写了个代码测试
#include
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])

struct uip_eth_hdr {
  char a[5];
  char b[6];
};

char uip_buf[]="abcdefghijk";
void main()
{
    printf("a is:%c",(BUF->b)[4]);
}    


解释:取
uip_buf第一个字符的地址 也就是数据的首地址,转换地址类型为struct uip_eth_hdr,并把地址宏定义为 buf。buf就可以像数据结构一样使用了。

你可能感兴趣的:(uip代码之#define BUF ((struct uip_eth_hdr *)&uip_buf[0]))