8

これが実際に何をするのかについて、ドキュメントに適切な説明が見つかりません。

AレコードまたはCNAMEレコード、あるいはその両方の存在をチェックしますか?

私の理解では、.NET 4では、ホストが存在しない場合、これはSocketExceptionをスローします。これは、私のテストによって確認されています。

4

3 に答える 3

10

これはによって返されるアドレスのリストです

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レコードを引っ張ると言うでしょう。

于 2012-06-06T08:41:55.210 に答える
10

Dns.GetHostEntryWindows 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すると、のAレコードからIPアドレスが返されwww.l.google.comます。

于 2012-06-06T08:58:24.080 に答える
2

ここで明確にするために、MartinLiversageの答えが最も正しい答えです。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);
}
于 2020-12-26T16:08:32.927 に答える