IP地址转换函数

通常,人们习惯用可读性好的字符串来表示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\n", 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\n", ip2);
}

in_addr_t其实就是32位无符号整数,需要注意的是,inet_ntoa是不可重入的,该函数内部用一个静态变量存储转化结果,函数的返回值指向该静态内存

从上面程序的结果就能揭示其不可重入性,上面输出两个127.0.0.1。

posted @ 2020-04-21 13:26  Rogn  阅读(551)  评论(0编辑  收藏  举报