Linux网络编程- inet_pton() & inet_ntop()

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. 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 <stdio.h>
#include <arpa/inet.h>

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;
}

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

程序的运行结果为:

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

inet_ntop()

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

函数原型:

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

参数:

  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 <stdio.h>
#include <arpa/inet.h>

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;
}

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

程序运行结果为:

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

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

猜你喜欢

转载自blog.csdn.net/weixin_43844521/article/details/133325151