域名的IPv6地址

时间:2011-05-12 22:58:50

标签: c networking network-programming ipv6 getaddrinfo

我正在搜索一个以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相关联。”

EDIT2:我同意你的意见,我在使用IPV6系统时遇到了麻烦,我已经尝试http://test-ipv6.com/了,似乎我没有IPV6地址但是ifconfig它返回:

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

2 个答案:

答案 0 :(得分:2)

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

基本思路是你只需要调用getaddrinfo一次并获得要连接的地址列表 - 如果该列表包含无法访问的地址,则程序必须先尝试超时才能尝试另一个地址。

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

解析主机名会尝试获取主机名的“A”记录,因为这适用于本地支持的唯一地址系列。没有这样的记录,因此它返回没有记录的信息。由于它从未要求过IPv6地址(这本来是没有意义的),所以它并没有抱怨这里的地址族不匹配。

答案 1 :(得分:2)

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

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