【问题标题】:IPv6 address to domain nameIPv6 地址转域名
【发布时间】:2011-08-24 12:51:45
【问题描述】:

我正在寻找一个以 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 地址,但使用 ifconfig 它返回:

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

【问题讨论】:

  • 对我来说似乎是一种迂回的方式来获取地址结构。为什么不直接将“2a00:1450:8006::68”传递给getaddrinfo
  • 听起来您的机器和/或网络不支持 IPv6 - 它应该可以工作吗?
  • 不知道你的代码,但我应该提到 2a00:1450:8006::68 实际上没有反向 DNS。如果您实际尝试使用具有反向 DNS 的 IPv6 地址,将会有所帮助。
  • 如果您的堆栈甚至能够支持 IPv6,那么绝对每个接口都会获得 fe80::/64 范围内的 IPv6 地址。
  • 制作 fe80::/10。不同的消息来源说不同的事情。但我相信标准说 fe80::/10。

标签: c networking network-programming ipv6 getaddrinfo


【解决方案1】:

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

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

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

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

【讨论】:

  • 我认为您对正在发生的事情是正确的,但我也认为这是一个错误。只有在提示中设置了AI_ADDRCONFIG 时,您描述的行为才会发生。
  • @R.:对于 glibc,将 hints 提供为 NULL 等效于 ai_family = AF_SPECai_flags = AI_V4MAPPED | AI_ADDRCONFIG。这似乎违反了 POSIX 规范。
  • @R.:我的意思是AF_UNSPEC。异常行为在 glibc getaddrinfo(3) 手册页的“NOTES”部分中注明为“...考虑对规范进行改进。”
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 2011-08-31
    • 2013-07-20
    • 1970-01-01
    • 2011-02-16
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多