Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254728
  • 博文数量: 56
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-13 10:12
文章分类

全部博文(56)

文章存档

2011年(1)

2010年(40)

2009年(15)

我的朋友

分类: C/C++

2010-01-21 11:09:21

这是linux对IP头的定义 /usr/include/linux/ip.h 或 linux/include/linux/ip.h)
struct iphdr {
#if __BYTE_ORDER == __LITTLE_ENDIAN
uint8_t ihl:4,
version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
uint8_t version:4,
ihl:4;
#endif
uint8_t tos;
uint16_t tot_len;
uint16_t id;
uint16_t frag_off;
uint8_t ttl;
uint8_t protocol;
uint16_t check;
uint32_t saddr;
uint32_t daddr;
/*The options start here. */
};
VxWorks  的target\h\netinet\Ip.h
/*
 * Structure of an internet header, naked of options.
 *
 * We declare ip_len and ip_off to be short, rather than u_short
 * pragmatically since otherwise unsigned comparisons can result
 * against negative integers quite easily, and fail in subtle ways.
 */
struct ip {
#if _BYTE_ORDER == _LITTLE_ENDIAN
 u_int ip_hl:4,  /* header length */
  ip_v:4,   /* version */
#endif
#if _BYTE_ORDER == _BIG_ENDIAN
 u_int ip_v:4,   /* version */
  ip_hl:4,  /* header length */
#endif
  ip_tos:8,  /* type of service */
  ip_len:16;  /* total length */
 u_short ip_id;   /* identification */
 short ip_off;   /* fragment offset field */
#define IP_DF 0x4000   /* dont fragment flag */
#define IP_MF 0x2000   /* more fragments flag */
#define IP_OFFMASK 0x1fff  /* mask for fragmenting bits */
 u_char ip_ttl;   /* time to live */
 u_char ip_p;   /* protocol */
 u_short ip_sum;   /* checksum */
 struct in_addr ip_src,ip_dst; /* source and dest address */
};
VC下的例子:
 struct BitField
 {
  int first:3;
  int second:2;
  int third:3;
 }field;
 field.first = 4;
 field.second = 2;
 field.third = 2;
 char *pChar = (char *)&field;
 printf("bit domain test:%d\n", *pChar);
 
field:100 10 010
打印出 010 10 100
 
总结:在小端环境下,先分配 least significant 3 bits,再分配middle 2 bits,最后分配most significant 3 bits。
 
推测:iphdr 中version和ihl区分大端,小端 方便对他们的处理
     现在有了字节序和位域序的概念,听说还有bit序待进一步了解
阅读(1609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~