printk扩展函数功能,打印内核ipv4地址32位网络字节序整形按点分十进制输出

6500阅读 0评论2013-06-07 dear531
分类:C/C++

内核源码目录文件/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这位前辈的文章,很好,并且回复他的博文,这位大师也给我做了回复,很是感激他老人家的态度,多谢这么瞧得起我,从现在开始也开始分享点东西,也不光当小白,去他那索取东西。
第二,我只是个初学者,不过当初为了这么个小技巧也找了很多地方,最后还是自己造车轮,很纠结,发出来,如果谁能看到,能给大家帮上忙,别忘了回复鼓励一下,表示我的辛苦还是有价值的,这是回贴的意义。如故要是和网上很多东西都重复了,那也没关系,多了放在这,也不碍谁的事,只方便想来找的人。
上一篇:没有了
下一篇:hp6910p-xp+ubuntu+centos三系统心得(自己备忘,有兴趣的也可以交流下)