通常,人们习惯用可读性好的字符串来表示IP,比如用点分十进制字符串表示IPv4,以及用十六进制字符串表示IPv6地址。但在编程中我们需要把它们转换成整数(二进制)才能使用。而记录日志则相反,我们要把整数表示的IP地址转换成可读的字符串
#include<arpa/inet.h> #include<stdio.h> #include<string.h> int main() { in_addr_t t = inet_addr("127.0.0.1"); // change net order struct in_addr addr; memcpy(&addr, &t, 4); char* ip = inet_ntoa(addr); // net order---> dot split printf("%s ", ip); in_addr_t t2 = inet_addr("127.0.0.2"); // change net order struct in_addr addr2; memcpy(&addr2, &t2, 4); char* ip2 = inet_ntoa(addr); // net order---> dot split printf("%s ", ip2); }
in_addr_t其实就是32位无符号整数,需要注意的是,inet_ntoa是不可重入的,该函数内部用一个静态变量存储转化结果,函数的返回值指向该静态内存。
从上面程序的结果就能揭示其不可重入性,上面输出两个127.0.0.1。