Dns.GetHostEntry Method(String) 实际上做了什么

本文关键字:实际上 什么 String GetHostEntry Method Dns | 更新日期: 2023-09-27 18:36:19

我在文档中找不到任何关于它实际作用的正确描述。

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

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

Dns.GetHostEntry Method(String) 实际上做了什么

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

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

这是返回的地址列表

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记录。

在这里要明确说明,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);
}