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