uip代码之#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
2013-11-22 12:10
846 查看
在看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 <stdio.h>
#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就可以像数据结构一样使用了。
#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 <stdio.h>
#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就可以像数据结构一样使用了。
相关文章推荐
- 高性能RPC over MINA&google protobuf 代码&实例 (一)
- 高性能RPC over MINA&google protobuf 代码&实例 (二)
- struct--iphdr sk_buff->tcphdr -- IP头部
- 高性能RPC over MINA&google protobuf 代码&实例 (二)
- 高性能RPC over MINA&google protobuf 代码&实例 (一)
- error: redefinition of 'struct iphdr'
- 如何解释 #define OFFSET(struct_type, member) ((size_t) &((struct_type *) 0)->member)
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- redefinition of 'struct iphdr'
- BZOJ4034 [HAOI2015]T2 题解&代码
- IE"单击以激活控件"网站代码解决法
- 重构代码坏味道(优雅,little code)<上>
- 数据库连接的两种实现方式(读取配置文件)——DBCP&C3P0;DBCP实现连接代码,C3P0实现连接代码——包含完整代码
- [C++基础]011_#define的代码生成的汇编码在哪里
- 借助SublimeLinter编写高质量的JavaScript & CSS代码
- Chromium代码:实现GPU->GPU的直接图片传递,不需要通过CPU进行中转
- 【POJ 2778】DNA Sequence 中文题意&题解&代码(C++)
- 《Windows程序设计》读书笔记------------->>窗口和消息 -- 代码结构和消息机制<<
- Intel 82599 ixgbe & ixgbevf CNA 卡驱动分析03——部分功能代码分析
- u.aly.dh: Required field 'client_stats' was not present! Struct: UALogEntry(client_stats:null, app_i