【发布时间】:2016-09-20 02:08:07
【问题描述】:
here 和 here 和 here 提出了一个类似的问题,但似乎没有一个答案有效,所以我发布了实际代码并显示它在支持 ipv6 的机器上运行,希望有人能提出解决方案
这是两个问题的代码
using System;
public class HelloWorld
{
static public void Main ()
{
string hostName = "google.com"; // uri.DnsSafeHost;
Console.WriteLine("DNS.GetHostAddresses: " + hostName);
var hostAddresses = System.Net.Dns.GetHostAddresses(hostName);
Console.WriteLine("DNS.NumAddreses:" + hostAddresses.Length);
foreach (System.Net.IPAddress hostAddress in hostAddresses)
{
Console.WriteLine(
"addr: " + hostAddress.ToString() +
" family: " + hostAddress.AddressFamily.ToString());
}
System.Net.IPHostEntry ipHostEntry = System.Net.Dns.GetHostEntry(hostName);
Console.WriteLine("DNS.GetHostEntry NumAddresses:" + ipHostEntry.AddressList.Length);
foreach (System.Net.IPAddress hostAddress in ipHostEntry.AddressList)
{
Console.WriteLine(
"addr: " + hostAddress.ToString() +
" family: " + hostAddress.AddressFamily.ToString());
}
}
}
我在带有 ipv6 的 Ubuntu 14.04 上运行它。以下是一些可能相关的信息
# ip -6 addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2400:6180:0:d0::691:9001/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::601:eeff:fe7e:201/64 scope link
valid_lft forever preferred_lft forever
证明 Google.com 有一个 ipv6 地址
# dig google.com AAAA +short
2404:6800:4003:c00::8a
显示我可以直接在其 ipv6 地址上 ping google.com
# ping6 2404:6800:4003:c00::8a
PING 2404:6800:4003:c00::8a(2404:6800:4003:c00::8a) 56 data bytes
64 bytes from 2404:6800:4003:c00::8a: icmp_seq=1 ttl=58 time=2.25 ms
64 bytes from 2404:6800:4003:c00::8a: icmp_seq=2 ttl=58 time=2.12 ms
^C
显示我的单声道版本
# mono --version
Mono JIT compiler version 4.2.3 (Stable 4.2.3.4/832de4b Wed Mar 16 13:19:08 UTC 2016)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: altstack
Notifications: epoll
Architecture: amd64
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: sgen
# mcs --version
Mono C# compiler version 4.2.3.0
编译运行上面的例子
# mcs dns.cs
# mono dns.exe
DNS.GetHostAddresses: google.com
DNS.NumAddreses:6
addr: 74.125.200.102 family: InterNetwork
addr: 74.125.200.139 family: InterNetwork
addr: 74.125.200.138 family: InterNetwork
addr: 74.125.200.101 family: InterNetwork
addr: 74.125.200.113 family: InterNetwork
addr: 74.125.200.100 family: InterNetwork
DNS.GetHostEntry NumAddresses:6
addr: 74.125.200.100 family: InterNetwork
addr: 74.125.200.113 family: InterNetwork
addr: 74.125.200.139 family: InterNetwork
addr: 74.125.200.102 family: InterNetwork
addr: 74.125.200.138 family: InterNetwork
addr: 74.125.200.101 family: InterNetwork
一些答案/cmets 建议 .NET 在仅 ipv4 的机器上过滤掉 ipv6。这显然不是仅 ipv4 的机器。
注意:这里在同一台机器上的 node.js 中做同样的事情。它正确获取了 ipv6 地址以及 ipv4 地址
# node
> require('dns').lookup("google.com", {all:true}, (err, addresses) => { console.log(addresses); });
GetAddrInfoReqWrap {
callback: { [Function: asyncCallback] immediately: true },
family: 0,
hostname: 'google.com',
oncomplete: [Function: onlookupall],
domain:
Domain {
domain: null,
_events: { error: [Function] },
_eventsCount: 1,
_maxListeners: undefined,
members: [] } }
> [ { address: '74.125.200.101', family: 4 },
{ address: '74.125.200.138', family: 4 },
{ address: '74.125.200.102', family: 4 },
{ address: '74.125.200.139', family: 4 },
{ address: '74.125.200.113', family: 4 },
{ address: '74.125.200.100', family: 4 },
{ address: '2404:6800:4003:c00::65', family: 6 } ]
如何让DNS.GetHostAddresses 或DNS.GetHostEntry 同时返回 ipv6 和 ipv4 地址?
【问题讨论】:
-
如果这在 MS.NET 中有效而不是在单声道中,请在 bugzilla.xamarin.com 中报告错误
-
5 年后 - 我遇到了同样的问题。在 Win10 .NET 4.8 上运行.. CMD 中的
nslookup返回主机的 4 个地址(3 个是 IPv6).. C# 中的GetHostAddresses返回 1 个 IPv4 地址..