打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
linux下将整型IPv4地址转换成点分十进制字符串的方法


今天看netfilter的源码,发现一个打印点分十进制的好方法:使用NIPQUAD和NIPQUAD_FMT宏:

#define NIPQUAD_FMT "%u.%u.%u.%u"#define NIPQUAD(addr) \ ((unsigned char *)&addr)[0],  ((unsigned char *)&addr)[1],  ((unsigned char *)&addr)[2],  ((unsigned char *)&addr)[3]

写个测试代码:

#include <stdio.h>#define NIPQUAD_FMT "%u.%u.%u.%u"#define NIPQUAD(addr) \ ((unsigned char *)&addr)[0],  ((unsigned char *)&addr)[1],  ((unsigned char *)&addr)[2],  ((unsigned char *)&addr)[3]int main() {    unsigned int ip;    ip = htonl(3232235777);    printf("ip = " NIPQUAD_FMT "\n", NIPQUAD(ip));}

输出结果:

tony@ubuntu-a:~/code$ ./a.out ip = 192.168.1.1

这个用法要注意的就是,NIPQUAD的参数需要是网络序的,所以事先用htonl转一下就可以了。

另外还看到一种用法,就是使用%pI4打印地址:

sprintf(buffer, "%pI4", &ip);

网上是这样说的:

The kernel's family of printf() functions has a special format specifier for IP-addresses (%pI4 for IPv4-addresses, %pI6 for IPv6).

也就是说这种格式仅供内核来使用,一般用户程序是不能用的。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
网络字节序列 及 转化函数
inet_pton()和inet_ntop()函数详解
【C++】Winsock套接字编程,struct sockaddr、sockaddr
Socket理解之地址族
CIPAddressCtrl类的使用(IP地址与CString的互相转化
Linux Socket编程-基础知识点
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服