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
#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;
}
这个简单的示例展示了如何使用 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_ntoa()
函数的一个更安全、更现代的版本,支持 IPv4 和 IPv6。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
AF_INET
(IPv4) 或 AF_INET6
(IPv6)。dst
的大小。dst
)。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;
}
在这个示例中,我们首先使用 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 地址的兼容性。