• Linux网络编程- inet_pton()函数


    inet_pton()

    inet_pton() 函数是 “Internet presentation to network” 的缩写,用于将 IP 地址的表现形式(例如字符串形式的 “127.0.0.1”)转换为其网络字节序的二进制形式。这个函数支持 IPv4 和 IPv6 地址。

    函数原型:

    int inet_pton(int af, const char *src, void *dst);
    
    • 1

    参数:

    1. af: 地址族 (Address Family)。常见的值为 AF_INET(对于 IPv4)和 AF_INET6(对于 IPv6)。

    2. src: 指向字符串形式的 IP 地址的指针。

    3. dst: 一个指向存储转换后的二进制地址的缓冲区的指针。对于 IPv4,这应该是一个指向 struct in_addr 的指针;对于 IPv6,这应该是一个指向 struct in6_addr 的指针。

    返回值:

    • 成功时返回1。

    • 如果输入地址不是有效的表现形式,返回0。

    • 出错时返回-1,并设置 errno 为具体的错误代码。

    使用和注意事项:

    1. 当设置套接字地址结构(如 struct sockaddr_instruct sockaddr_in6)时,通常需要使用 inet_pton() 来转换用户提供或其他来源的字符串 IP 地址。

    2. 使用 inet_pton() 替代过时的 inet_aton()inet_addr() 函数可以提供更好的 IPv6 兼容性和错误处理。

    示例:

    #include 
    #include 
    
    int main() {
        const char *ip_str = "192.168.1.1";
        struct in_addr ip_addr;  // for IPv4
    
        if (inet_pton(AF_INET, ip_str, &ip_addr) <= 0) {
            perror("inet_pton");
            return 1;
        }
    
        printf("Binary representation of IP: %u\n", ip_addr.s_addr);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这个简单的示例展示了如何使用 inet_pton() 函数将 IPv4 地址字符串 “192.168.1.1” 转换为其二进制网络字节序形式,并将结果存储在 struct in_addr 结构中。

    程序的运行结果为:

    majn@tiger:~/C_Project/network_project$ ./inet_pton_demo 
    Binary representation of IP: 16885952
    
    • 1
    • 2

    inet_ntop()

    inet_ntop() 函数是一个网络工具函数,用于将网络地址结构转换为字符串。它是传统 inet_ntoa() 函数的一个更安全、更现代的版本,支持 IPv4 和 IPv6。

    函数原型:

    const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
    
    • 1

    参数:

    1. af: 地址家族(address family),如 AF_INET (IPv4) 或 AF_INET6 (IPv6)。
    2. src: 指向包含要转换的网络地址的结构的指针。
    3. dst: 指向将存放结果字符串的缓冲区的指针。
    4. size: 目标存储位置 dst 的大小。

    返回值:

    • 成功: 返回一个指向转换后的地址字符串的指针(也就是 dst)。
    • 失败: 返回 NULL 并设置 errno

    示例:

    以下是一个使用 inet_ntop() 的简单示例,该示例将 IPv4 和 IPv6 地址从它们的二进制形式转换为字符串形式:

    #include 
    #include 
    
    int main() {
        unsigned char buf[sizeof(struct in6_addr)];
        char str[INET6_ADDRSTRLEN];
    
        // 为 IPv4 地址
        inet_pton(AF_INET, "192.168.1.1", buf);
        printf("%s\n", inet_ntop(AF_INET, buf, str, sizeof(str)));
    
        // 为 IPv6 地址
        inet_pton(AF_INET6, "2001:0db8:85a3:0000:0000:8a2e:0370:7334", buf);
        printf("%s\n", inet_ntop(AF_INET6, buf, str, sizeof(str)));
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这个示例中,我们首先使用 inet_pton() 函数将 IP 地址字符串转换为它们的二进制形式,然后使用 inet_ntop() 将它们转换回字符串。

    程序运行结果为:

    majn@tiger:~/C_Project/network_project$ ./inet_ntop_demo 
    192.168.1.1
    2001:db8:85a3::8a2e:370:7334
    
    • 1
    • 2
    • 3

    总的来说,inet_ntop() 提供了一种可靠的方法来避免许多常见的字符串操作相关的错误,并确保与 IPv4 和 IPv6 地址的兼容性。

  • 相关阅读:
    MySQL-索引
    2024最新 Jenkins + Docker实战教程(七)- Jenkins实现远程传输和自动部署
    【原理篇】四、自定义starter
    太空射击第14课: 玩家生命
    Teams Tab App 的 manifest 分析
    LiveNVR监控流媒体Onvif/RTSP功能-海康摄像头海康NVR通过EHOME协议ISUP协议接入支持转GB28181级联
    如何在 Python 中实现遗传算法
    Springboot美食网u1652计算机毕业设计-课程设计-期末作业-毕设程序代做
    托育老师每天只是“看”孩子吗?“托”和“育”哪个更重要?
    Linux从入门到精通(九)——Linux编程
  • 原文地址:https://blog.csdn.net/weixin_43844521/article/details/133325151