2012-06-06 14 views
6

Ich finde keine richtige Beschreibung in der Dokumentation für das, was dies tatsächlich tut.Was macht Dns.GetHostEntry-Methode (String) eigentlich?

Sucht es nach dem Vorhandensein von A-Datensätzen oder CNAME-Datensätzen oder beidem?

Mein Verständnis ist, dass in .NET 4 eine SocketException auslöst, wenn der Host nicht existiert, und dies wird durch meine Tests bestätigt.

Antwort

7

Dies ist die Liste der Adressen von

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 

Und das ist die A-Datensätze gezogen von network-tools.com, DNS-Abfrage zurückgegeben.

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

Also würde ich sagen, dass es A-Datensätze nicht ziehen.

+0

Vielen Dank für eine viel bessere Antwort. –

+0

Hier ist die Open-Source, C# -Bibliothek, die ich für DNS-Abfragen verwende http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component, die ich von dieser Frage gefunden habe, http: // stackoverflow.com/questions/1061248/getting-ns-record-type-using-c-sharp-dns/1061268#comment12106649_1061268 – Despertar

+0

perfekt! perfekt in allem! –

4

Dns.GetHostEntry ist auf der Windows-API aufgebaut und verwendet das DNS-Protokoll nicht direkt. Wenn IPv6 aktiviert ist, wird getaddrinfo aufgerufen. Sonst wird es gethostbyaddr anrufen. Diese Funktionen können die lokale %SystemRoot%\System32\drivers\etc\hosts-Datei, DNS oder sogar NETBIOS verwenden, um einen Hostnamen in eine IP-Adresse aufzulösen. Wenn Sie einen Hostnamen mithilfe von DNS in eine IP-Adresse auflösen, werden CNAME-Einträge verwendet, um den A-Eintrag zu finden.

Sie können dies testen, indem Sie www.google.com auflösen, die mindestens jetzt einen CNAME-Datensatz hat, der auf www.l.google.com zeigt. Mit Dns.GetHostEntry werden die IP-Adressen aus den A-Datensätzen für www.l.google.com zurückgegeben.

+0

Richtig, Sie sagen also, dass es sowohl CNAME- als auch A-Datensätze verwendet, da es den CNAME-Datensätzen folgt, um die A-Datensätze zu finden. Und der Fehler, A-Datensätze zu finden, würde die SocketException werfen? –

+0

Ich bin mir nicht sicher über den CNAME-Teil. Schließlich verwenden nur Subdomänen CNAMEs, um vollständig qualifizierten Domänen zuzuordnen (ftp.domain.com CNAME domain.com). Allerdings muss domain.com selbst einen A-Eintrag haben, also wie würde das mit Dns.GetHostEntry ("domain.com") funktionieren? Ich habe GetHostEntry() mit zwei meiner Subdomains getestet, jede hat einen A-Record, der auf einen anderen Server zeigt, und GetHostEntry gab diese Ips zurück, und wenn ich diese A-Datensätze ändere, bin ich sicher, dass sie die Ergebnisse von GetHostEntry() verändern werden. Google.com ist die am meisten frequentierte Website der Welt, also glaube ich nicht, dass dies ein guter Maßstab für Konsistenzen ist. – Despertar

+0

@GregT: Ein kleiner Test ist wahrscheinlich der beste Weg, um Ihre Frage zu beantworten. Ich bin mir nicht sicher, wie "getaddrinfo" sich verhält, wenn es einen CNAME-Datensatz gibt, der nicht auf einen A-Datensatz zeigt. Der Quellcode für 'Dns.GetHostEntry' ist jedoch öffentlich verfügbar und soweit ich sehen kann, wird ein Socket-Fehler in eine' SocketException' gehüllt. –