在 C/C++ 中,inet_ntop
和 inet_addr
函数用于处理网络地址的转换。它们定义在 <arpa/inet.h>
头文件中,这是 UNIX/Linux 系统中用于网络编程的标准库之一。
1. inet_addr
- 功能:将 IPv4 地址的字符串格式(例如 “192.168.1.1”)转换为网络字节顺序的无符号长整型(
in_addr_t
),通常用于设置 socket 地址结构中的 IP 字段。 - 原型:
in_addr_t inet_addr(const char *cp);
2. inet_ntop
- 功能:将网络字节顺序的 IP 地址(如
struct sockaddr_in
中的地址)转换为可读的字符串形式。 - 原型:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
使用示例
下面是一个简单的示例,展示如何使用这两个函数:
#include <iostream>
#include <arpa/inet.h>
int main() {
// 使用 inet_addr 将字符串转换为网络字节顺序的地址
const char *ip_str = "192.168.1.1";
in_addr_t addr = inet_addr(ip_str);
if (addr == INADDR_NONE) {
std::cerr << "Invalid IP address format!" << std::endl;
return 1;
}
std::cout << "IP address in network byte order: " << addr << std::endl;
// 使用 inet_ntop 将网络字节顺序地址转换回字符串
struct sockaddr_in sa;
sa.sin_family = AF_INET; // IPv4
sa.sin_port = htons(0); // 不关心端口号,设置为0
sa.sin_addr.s_addr = addr; // 设置地址
char str[INET_ADDRSTRLEN]; // IPv4 的最大长度为 16 字节 + '\0'
if (inet_ntop(AF_INET, &sa.sin_addr, str, sizeof(str)) == nullptr) {
perror("inet_ntop");
return 1;
}
std::cout << "IP address in presentation format: " << str << std::endl;
return 0;
}
编译和运行
要编译上述代码,可以使用以下命令:
g++ -o example example.cpp
然后运行程序:
./example
你应该会看到如下输出:
IP address in network byte order: <某个数字>
IP address in presentation format: 192.168.1.1
注意事项
- 在使用
inet_pton()
和inet_ntop()
时,请确保提供合适大小的缓冲区,以防止缓冲区溢出。 inet_pton()
是与inet_ntoa()
相对的新函数,用于将字符串表示法转换为网络字节序。在处理 IPv6 时,它比inet_addr()
更加灵活。
希望这些信息对你有所帮助!如果有任何疑问,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问