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);
参数:
-
af: 地址族 (Address Family)。常见的值为
AF_INET
(对于 IPv4)和AF_INET6
(对于 IPv6)。 -
src: 指向字符串形式的 IP 地址的指针。
-
dst: 一个指向存储转换后的二进制地址的缓冲区的指针。对于 IPv4,这应该是一个指向
struct in_addr
的指针;对于 IPv6,这应该是一个指向struct in6_addr
的指针。
返回值:
-
成功时返回1。
-
如果输入地址不是有效的表现形式,返回0。
-
出错时返回-1,并设置
errno
为具体的错误代码。
使用和注意事项:
-
当设置套接字地址结构(如
struct sockaddr_in
或struct sockaddr_in6
)时,通常需要使用inet_pton()
来转换用户提供或其他来源的字符串 IP 地址。 -
使用
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);
参数:
- af: 地址家族(address family),如
AF_INET
(IPv4) 或AF_INET6
(IPv6)。 - src: 指向包含要转换的网络地址的结构的指针。
- dst: 指向将存放结果字符串的缓冲区的指针。
- 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 地址的兼容性。