inet_ntop
函数用于将网络字节序的 IP 地址(IPv4 或 IPv6)转换为可读的字符串格式。与 inet_ntoa
仅支持 IPv4 地址不同,inet_ntop
可以处理 IPv4 和 IPv6 地址,因此更为通用和灵活。
函数原型
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数说明
- af: 指定地址族,可以是
AF_INET
(IPv4)或AF_INET6
(IPv6)。 - src: 指向包含网络字节序地址的缓冲区。
- dst: 用于存储转换后字符串的缓冲区,通常是一个字符数组。
- size:
dst
缓冲区的大小,以字节为单位。
返回值
- 成功时返回指向目标缓冲区
dst
的指针;失败时返回NULL
,并且可以通过errno
获取错误信息。
注意事项
线程安全:与
inet_ntoa
不同,inet_ntop
是线程安全的,因为它使用提供的用户分配的缓冲区来存储结果,而不是静态内存。IPv6 支持:能够处理 IPv6 地址,这是现代网络编程中非常重要的一点。
缓冲区大小:确保提供给
dst
的缓冲区足够大,以容纳转换后的字符串。对于 IPv4,推荐使用至少 16 字节,而对于 IPv6,则应使用 46 字节或更多,以确保包含所有可能的表示形式。
示例代码
下面是一个示例,展示了如何使用 inet_ntop
:
#include <iostream>
#include <arpa/inet.h>
int main() {
// 示例:处理 IPv4 地址
struct sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(80);
inet_pton(AF_INET, "192.168.1.1", &sa.sin_addr);
char ipStr[INET_ADDRSTRLEN];
if (inet_ntop(AF_INET, &(sa.sin_addr), ipStr, sizeof(ipStr)) != nullptr) {
std::cout << "IPv4 Address: " << ipStr << std::endl;
} else {
std::cerr << "Error converting address" << std::endl;
}
// 示例:处理 IPv6 地址
struct sockaddr_in6 sa6;
sa6.sin_family = AF_INET6;
inet_pton(AF_INET6, "2001:0db8:85a3:0000:0000:8a2e:0370:7334", &sa6.sin6_addr);
char ipStrV6[INET6_ADDRSTRLEN];
if (inet_ntop(AF_INET6, &(sa6.sin6_addr), ipStrV6, sizeof(ipStrV6)) != nullptr) {
std::cout << "IPv6 Address: " << ipStrV6 << std::endl;
} else {
std::cerr << "Error converting address" << std::endl;
}
return 0;
}
在这个示例中,我们首先创建了一个用于存储 IPv4 和 IPv6 地址的结构体,并用相应的地址初始化它们。然后我们调用 inet_ntop()
将其转换成可读字符串格式,并输出结果。
内容由零声教学AI助手提供,问题来源于学员提问