2011-05-12 133 views
1

我在寻找一个以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);返回错误“没有地址与热名称关联”。

EDIT2:我同意你的看法,我已经与IPV6系统的麻烦,我已经试过http://test-ipv6.com/,看来,我没有IPV6 ADRESS但ifconfig它返回:

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

似乎是一个迂回的方式来获取我的地址结构。为什么不把“2a00:1450:8006 :: 68”传递给'getaddrinfo'? – Santa 2011-05-12 23:00:28

+1

这听起来像您的机器和/或网络不支持IPv6 - 它应该工作吗? – 2011-05-12 23:10:59

+0

不知道你的代码,但我应该提到2a00:1450:8006 :: 68实际上没有反向DNS。如果您实际尝试使用具有反向DNS的IPv6地址,这将有所帮助。 – 2011-05-13 12:47:22

回答

1

我想您没有有效的IPv6配置。 getaddrinfo()只会返回可达的IPv6答案,因此如果您的系统没有全球范围的IPv6地址和到达解析地址的路由,结果将从结果集中删除。

其基本思想是您只需拨打getaddrinfo一次并获取要连接的地址列表 - 如果该列表包含无法访问的地址,则在尝试另一个地址之前,程序必须首先运行超时。

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

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

+0

我认为你对发生的事情是正确的,但我也认为这是一个错误。您所描述的行为只有在提示中设置了'AI_ADDRCONFIG'时才会发生。 – 2011-05-12 23:30:10

+1

@R .:对于glibc,提供'hints'作为'NULL'相当于'ai_family = AF_SPEC'和'ai_flags = AI_V4MAPPED | AI_ADDRCONFIG'。这似乎违背了POSIX规范。 – caf 2011-05-13 00:52:51

+0

什么是AF_SPEC? – 2011-05-13 01:01:53

2

你是第一步使用getaddrinfo的权利,但它不能为你做reverse-dns查找。您需要使用getaddrinfo将地址的字符串格式转换为sockaddr,然后您可以将该地址传递给getnameinfo进行反向查找。

就这样说,我认为卡尔的评论也是相关的。看起来你的系统配置为不支持IPv6 ...