IPv6地址转换为域名

3

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

举个例子,2a00:1450:8006::68返回ipv6.google.com。

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

谢谢 :-)

编辑1:我尝试了getaddrinfo("2a00:1450:8006::68", "http", NULL, &result);,它返回"address family for hostname not supported",而getaddrinfo("ipv6.google.com", "http", NULL, &result);返回"no address is associated with hotname"错误。

编辑2:我同意你的观点,我在IPV6系统上遇到了问题,我尝试了http://test-ipv6.com/,结果显示我没有IPV6地址,但使用ifconfig命令返回:

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

2
对我来说,这似乎是一个绕弯子的方式来获取地址结构。为什么不直接将"2a00:1450:8006::68"传递给getaddrinfo呢? - undefined
1
听起来你的机器和/或网络不支持IPv6 - 它应该工作吗? - undefined
对于你的代码我没有什么想法,但是我应该提到2a00:1450:8006::68实际上没有反向DNS。如果你尝试使用一个有反向DNS的IPv6地址会更有帮助。 - undefined
如果您的网络堆栈支持IPv6,那么每个接口都会在fe80::/64范围内获得一个IPv6地址。 - undefined
让它变成 fe80::/10。不同的来源给出了不同的说法。但我相信标准规定是 fe80::/10。 - undefined
2个回答

6
我认为您没有有效的IPv6配置。 getaddrinfo() 只会返回可达的IPv6答案,因此,如果您的系统没有具有全局范围和路由到已解析地址的IPv6地址,则结果将从结果集中删除。
基本思想是您调用一次getaddrinfo并获得要连接的地址列表 - 如果该列表包含无法访问的地址,则程序必须先运行到超时,然后才尝试另一个地址。
“主机名的地址族不受支持”意味着它已经识别出该地址是无需通过DNS解析的IPv6地址,因此它尝试将其与允许的地址族列表进行匹配,失败并返回错误。
解析主机名尝试获取主机名的“A”记录,因为这是本地唯一支持的地址系列。不存在这样的记录,因此它会返回没有记录的信息。由于它从未请求过IPv6地址(这将是无意义的),因此它在这里不会抱怨地址族不匹配。

我认为你对正在发生的事情是正确的,但我也认为这是一个 bug。你所描述的行为只应该在 hints 中设置了 AI_ADDRCONFIG 才会发生。 - undefined
1
@R:对于glibc,将hints设为NULL相当于ai_family = AF_SPECai_flags = AI_V4MAPPED | AI_ADDRCONFIG。这似乎与POSIX规范相悖。 - undefined
1
@R.:我指的是AF_UNSPEC。在glibc getaddrinfo(3)手册的“NOTES”部分中,这种异常行为被认为是一种“...对规范的改进”。 - undefined

2
你使用getaddrinfo作为第一步是正确的,但它不能为您执行反向DNS查找。您需要使用getaddrinfo将地址的字符串形式转换为sockaddr,然后将其传递给getnameinfo来进行反向查找。
话虽如此,我认为卡尔的评论也很相关。似乎你的系统未配置支持IPv6...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接