Dns.GetHostEntry方法(String)实际上做了什么?

时间:2012-06-06 08:23:58

标签: c# .net dns host system.net

我无法在文档中找到任何适当的描述。

是否检查A记录或CNAME记录是否存在?

我的理解是,在.NET 4中,如果主机不存在,则抛出SocketException,并且我的测试证实了这一点。

3 个答案:

答案 0 :(得分:7)

这是

返回的地址列表
var ips = System.Net.Dns.GetHostEntry("microsoft.com").AddressList;
foreach (var ip in ips)
    Console.WriteLine(ip);

// output
64.4.11.37
65.55.58.201

这些是从network-tools.com,DNS查询中提取的A记录。

Answer records
microsoft.com       A   64.4.11.37  
microsoft.com       A   65.55.58.201

所以我说它确实拉了A记录。

答案 1 :(得分:4)

Dns.GetHostEntry构建于Windows API之上,不直接使用DNS协议。如果启用了IPv6,则会调用getaddrinfo。否则会调用gethostbyaddr。这些函数可以使用本地%SystemRoot%\System32\drivers\etc\hosts文件,DNS甚至NETBIOS将主机名解析为IP地址。使用DNS将主机名解析为IP地址将使用CNAME记录来查找A记录。

您可以通过解析至少现在具有指向www.google.com的CNAME记录的www.l.google.com来测试此问题。使用Dns.GetHostEntry将返回www.l.google.com的A记录中的IP地址。

答案 2 :(得分:2)

这里要明确说明,Martin Liversage 的答案是最正确的答案。该 api 将首先尝试定位正在解析的域的 CNAME 记录。如果找到 CNAME 记录,api 将尝试解析从 CNAME 记录返回的域的 A 记录。如果正在解析的域没有 CNAME 记录,则它将尝试解析域本身的 A 记录。

要检测 CNAME 记录何时存在,可以根据输入的主机名检查解析的主机名。示例:

IPHostEntry iphostEntry = Dns.GetHostEntry(inputHostname);
if (iphostEntry.Hostname != inputHostname) {
    Console.WriteLine("CNAME record exists pointing {0} to {1}", inputHostname, iphostEntry.Hostname);
    Console.WriteLine("iphostEntry.AddressList values are the A record values of {0}", iphostEntry.Hostname);
} else {
    Console.WriteLine("CNAME record does NOT exist for {0}", inputHostname);
    Console.WriteLine("iphostEntry.AddressList values are the A record values of {0}", inputHostname);
}