Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34763
  • 博文数量: 6
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 79
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-21 19:46
个人简介

还好!

文章分类
文章存档

2016年(1)

2015年(4)

2013年(1)

我的朋友

分类: C/C++

2013-06-07 17:02:57

内核源码目录文件/include/linux/ip.h对三层(L3)ip头这样定义:
我们现在不讨论ip协议是如何解析的,说个pintk的小技巧,如何将32位网络字节序的数据类型,直接调用printk函数将其输出为点分十进制。
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
        __u8    ihl:4,
                version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
        __u8    version:4,
                ihl:4;      
#else                       
#error  "Please fix "
#endif                      
        __u8    tos;
        __be16  tot_len;    
        __be16  id;
        __be16  frag_off;   
        __u8    ttl;        
        __u8    protocol;
        __sum16 check;
        __be32  saddr;
        __be32  daddr;
        /*The options start here. */
};
        __be32  saddr;
        __be32  daddr;

这两行便是在ip层传输的源地址和目的地址,原来我用的时候是自己造了个车轮,自己实现了一个函数,但不用这么辛苦的,前辈们早已经为我们设计好了:
printk(打印级别宏"%pI4",ip->saddr);
这样就行了,其中转义控制字符是p是point指针的意思,I是大写字母i代表ip,4当然是ipv4的意思,这样就能直接将32位网络字节序的地址输出为点分十进制。
其实原理也很简单,32位网络字节序是4x8位,每8位表示0-255,也就正好是每个点分十进制的表示范围,然后将网络字节序,按主机字节序的顺序按每一个八位,取出并按无符号整型打印,并中间用点“.”分隔就成了。
发表这个有两层意义:
第一,看了wjlkoorey258这位前辈的文章,很好,并且回复他的博文,这位大师也给我做了回复,很是感激他老人家的态度,多谢这么瞧得起我,从现在开始也开始分享点东西,也不光当小白,去他那索取东西。
第二,我只是个初学者,不过当初为了这么个小技巧也找了很多地方,最后还是自己造车轮,很纠结,发出来,如果谁能看到,能给大家帮上忙,别忘了回复鼓励一下,表示我的辛苦还是有价值的,这是回贴的意义。如故要是和网上很多东西都重复了,那也没关系,多了放在这,也不碍谁的事,只方便想来找的人。
阅读(6506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~