【问题标题】:GetHostAddress() returns no IPv6, only IPv4GetHostAddress() 不返回 IPv6,只返回 IPv4
【发布时间】:2011-11-17 20:42:13
【问题描述】:

使用 Dns.GetHostAddresses("fred") 时,它仅返回 IPv4 地址作为响应。如何获取 IPv6 地址?我应该使用不同的方法吗?

Socket.OSSupportsIPv6 返回 true 并且 IPv6 连接工作正常。操作系统为Windows 2008 R2,.Net版本为3.5。

【问题讨论】:

  • “fred”是否有与之关联的 IPv6 DNS 记录?
  • @Lazarus:不,我没有 - 我已将条目添加到 hosts 文件中,现在我已经解析了 ipv4 和 ipv6 地址!我如何知道是否有与主机名关联的 dns 记录?为什么“ping -6 fred”可以正常工作,而 GetHostAddresses() 却不行?
  • @ya23 我怀疑 ping 在无法解析 IPv6 时会退回到 IPv4 查找。
  • Windows 可能一直在你背后做一些偷偷摸摸的 LLMNR。始终使用 DNS。
  • @Lazarus, @ Jeremy Visser:添加 DNS 记录已解决问题。请将其发布为答案,以便我接受。如果您还可以解释为什么 ping 如此具有误导性,那就太好了 - 它可以很好地解析主机名。

标签: c# dns ipv6


【解决方案1】:

IPv6 仍然使用 DNS 来解析地址,因此为了使其正常工作,您需要将 IPv6 条目添加到该域名的区域文件中。然后它会正确解决。

我怀疑如果 IPv6 不可用,Ping 会回退到 IPv4,这与您指定“-6”标志后所希望的不完全一样。

【讨论】:

  • 这不是我所看到的。如果我在 node.js 中使用dns.lookup('google.com',{all:true}, ...) 进行查询,我会得到一个 ipv6 和 ipv4 地址,而在 C# 中使用Dns.GetHostAddresses("google.com") 在同一台机器上不会返回 ipv6 地址。
  • 如果系统上未安装 IPv6,GetHostAddresses 将过滤 IPv6 地址。鉴于 Google 不在您的本地网络上,您可能会得到一个映射到 IPv6 的 IPv4。你和谷歌之间有端到端的 IPv6 吗?我在这里假设 node.js 和 .Net 执行系统是相同的,如果不是,则两者都配置为相同的 DNS 解析链。
  • Here's the example。也许我在做一些愚蠢的事情
【解决方案2】:

如果有人在 2021 年仍然遇到此问题,System.Net.Dns 类有一个未记录的行为:它会过滤它认为无法访问的地址,当您除了环回之外唯一的 IPv6 地址是 link-local 时。即使域名专门解析为 v6 地址(您可以尝试使用v6.localhost.ayra.ch),也会执行此过滤,在这种情况下会引发异常。

如果您位于仅 IPv4 的网络中,但希望能够在 .NET 中解析 v6 地址,则可以通过手动为您的设备分配自定义 IP 来解决此问题。为您的设备分配 IPv6 地址 2001:db8::1,前缀长度为 32,并且没有默认网关。到目前为止,我还没有发现任何因此而停止工作的东西,.NET 现在将解析 IPv6。

请注意,建议的 IPv6 地址和范围保留用于文档,这意味着您根本不应该在 Internet 上遇到此范围。如果您想确保您的选择不会与遵循此说明的其他人的地址冲突,我建议您将 mac 地址用于最后 3 个地址段。

我创建了一个页面,可以使用您的 MAC 或随机生成这些地址:https://cable.ayra.ch/docmac/

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2013-08-24
    • 1970-01-01
    • 2016-09-20
    • 2012-02-26
    • 2019-09-10
    相关资源
    最近更新 更多