如果你想使用 sockaddr_in6
进行地址查找,通常是为了处理 IPv6 地址的情况。在 C++ 中,使用 getaddrinfo
函数可以方便地获取与域名对应的 IP 地址信息,包括 IPv6 地址。以下是一个示例程序,展示了如何使用 sockaddr_in6
查找 IPv6 地址。
示例代码
#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <netdb.h>
int main() {
const char* hostname = "www.example.com"; // 替换为你要查找的主机名
struct addrinfo hints, *res;
// 清空 hints 结构体并设置参数
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6; // 使用 IPv6
hints.ai_socktype = SOCK_STREAM; // TCP 套接字
// 获取地址信息
int status = getaddrinfo(hostname, NULL, &hints, &res);
if (status != 0) {
std::cerr << "getaddrinfo error: " << gai_strerror(status) << std::endl;
return 1;
}
// 遍历结果链表,找到所有的 IPv6 地址
for (struct addrinfo* p = res; p != nullptr; p = p->ai_next) {
if (p->ai_family == AF_INET6) { // 确保是 IPv6 地址
sockaddr_in6* ipv6 = reinterpret_cast<sockaddr_in6*>(p->ai_addr);
char ipstr[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &(ipv6->sin6_addr), ipstr, sizeof(ipstr));
std::cout << "IPv6 address: " << ipstr << std::endl;
}
}
freeaddrinfo(res); // 释放地址信息链表
return 0;
}
说明
- 准备
addrinfo
结构:首先,我们创建一个addrinfo
类型的结构体,并初始化其中的成员以指定我们想要的信息(例如,只关心 IPv6)。 - 调用
getaddrinfo
:该函数会填充提供的地址信息。 - 遍历结果:通过循环访问返回的链接表,我们检查每个地址是否为 IPv6,并将其打印出来。
- 转换地址格式:使用
inet_ntop
将网络字节顺序的 IP 地址转换为可读字符串格式。 - 释放资源:最后,我们调用
freeaddrinfo
来释放之前分配的内存。
编译和运行
确保在编译时链接网络库,例如:
g++ -o ipv6_lookup ipv6_lookup.cpp -lpthread
然后运行生成的可执行文件:
./ipv6_lookup
这个程序会输出给定主机名对应的所有 IPv6 地址。你可以更改 hostname
的值来查询不同的网站或服务器。
内容由零声教学AI助手提供,问题来源于学员提问