C语言 域名的 IPv6 地址



>我正在寻找一个以IPv6地址作为参数并返回域名的函数。

为了清楚起见,2a00:1450:8006::68 返回 ipv6.google.com。

(目的是将此域名提供给getaddrinfo函数。

谢谢 :-)

edit1:我试过getaddrinfo("2a00:1450:8006::68", "http", NULL, &result);,它返回"不支持主机名的地址系列",getaddrinfo("ipv6.google.com", "http", NULL, &result);返回错误"没有地址与hotname关联"。

编辑2:我同意你的看法,我在IPV6系统上遇到了问题,我已经尝试了 http://test-ipv6.com/,似乎我没有IPV6地址,但ifconfig它返回:

adr inet6: fe80::15b:fcff:fe65:d516/64 Scope:Lien

我认为您没有有效的IPv6配置。 getaddrinfo()将仅返回可访问的 IPv6 答案,因此如果您的系统没有具有全局范围的 IPv6 地址和到解析地址的路由,则结果将从结果集中删除。

基本思想是,您调用getaddrinfo一次并获取要连接的地址列表 - 如果该列表包含无法访问的地址,则程序必须先遇到超时,然后再尝试另一个地址。

"不支持主机名的地址系列"表示它已识别该地址是不需要通过 DNS 解析的 IPv6 地址,因此它会尝试将其与允许的地址系列列表进行匹配,失败并返回错误。

解析主机名会尝试获取主机名的"A"记录,因为这适用于本地支持的唯一地址系列。不存在此类记录,因此它返回不存在记录的信息。由于它从未要求IPv6地址(这是毫无意义的),因此它不会在这里抱怨地址系列不匹配。

getaddrinfo作为第一步是正确的,但它无法为您执行反向 dns 查找。您需要使用 getaddrinfo 将地址的字符串形式转换为 sockaddr ,然后您可以将其传递给 getnameinfo 以进行反向查找。

话虽如此,我认为卡尔的评论也是相关的。似乎您的系统配置为不支持IPv6...

最新更新