Kann Dns.GetHostEntry jemals eine IPHostEntry mit einem leeren Address zurückkehren?

StackOverflow https://stackoverflow.com/questions/156585

  •  03-07-2019
  •  | 
  •  

Frage

Ich frage mich nur, ob es kann ein Fall sein, wenn der Host-Name erfolgreich aufgelöst werden, aber die zurück hostEntry.AddressList ist leer.

Zur Zeit so etwas wie dies ich tue:

IPHostEntry hostEntry = Dns.GetHostEntry("some.hostname.tld");
if (hostEntry.AddressList.Count() < 1)
{
  // can that ever happen?
  throw new ArgumentException("hostName has no assigned IP-Address");
}
TcpClient client = new TcpClient(hostEntry.AddressList[0], 1234);

Meine Vermutung ist, dass Dns.GetHostEntry entweder wirft eine Ausnahme, wenn der Hostname nicht gefunden wird oder auf andere Weise die Address ist nicht leer, aber ich bin mir nicht sicher.

War es hilfreich?

Lösung

Nein, du wirst nicht eine leere Adressliste sehen: auch wenn Sie einen DNS-Etikett abfragen, die vorhanden ist, hat aber keine A oder AAAA (IPv6) Aufzeichnungen, eine Socket ( „No Host ist unbekannt“) wird geworfen.

Sie können dies überprüfen, an der Funktion InternalGetHostByName(string hostName, bool includeIPv6) in DNS.cs von .NET Referenzstelle Mitteilung suchen. Mit Ausnahme einiger plattformspezifischen Vorsichtsmaßnahmen, DNS-Lookups sind eine einfache Wrapper um den Winsock gethostbyname Funktion.

Gethostbyname wird entweder scheitern oder Rückkehr eine Adressliste. Eine leere Adressliste wird nie zurückgegeben, da die Funktion mit WSANO_DATA fehl ( „Gültigem Namen, kein Datensatz des angeforderten Typs“) in diesem Fall, die an die Buchse Ausnahme übersetzt sahen wir bereits in .NET.

EDIT Mai 2012 durch Antworten aufgefordert, die besagt, dass eine leere Liste ohnehin zurückgegeben: Sie beachten Sie, dass diese Antwort nur auf Win32 gilt, und dass Plattformen wie WinCE kann ganz anders verhalten. Wenn Sie "leere Liste Verhalten auf Win32 sind zu sehen, und die Anfrage Sie machen ist gegen einen öffentlich zugänglichen DNS-Server, hinterlassen bitte Code ...

Andere Tipps

Nur für die Datensätze.

Dank mdb akzeptierte Antwort habe ich einen Blick auf die Beschreibung des WSANO_DATA Fehler :

  

Der angeforderte Name ist gültig und wurde in der Datenbank nicht gefunden, aber es funktioniert   nicht die richtigen zugeordneten Daten für aufgelöst zu werden. Das übliche Beispiel   denn dies ist ein Host-Name-to-Address Translation Versuch (mit gethostbyname oder   WSAAsyncGetHostByName), die das DNS (Domain Name Server) verwendet. Ein MX-Eintrag   zurückgegeben wird, aber kein A-Eintrag anzeigende den Host selbst vorhanden ist, ist aber nicht   direkt erreichbar.

Also das so ziemlich beantwortet meine Frage:)

Sie haben drei mögliche Situationen hier:

  1. Der Hostname existiert (DNS einen A Record) und löst in eine IP-Adresse

    • Bedingung wird nie getroffen
  2. Der Hostname existiert (DNS kennt die Domain) jedoch keine A-Datensätze vorhanden ist.

    • Dies ist ein äußerst unwahrscheinliches Szenario, und ich denke, das nie an erster Stelle passieren kann.
  3. Der Hostname existiert nicht

    • Ausnahme geworfen wird, die Sie nie dorthin gelangen.

Also nein, ich glaube nicht, dass jemals passieren.

Die Antwort ist YES . Die GetHostEntry Methode fragt einen DNS-Server für die IP-Adressen und Aliase mit einer IP-Adresse zugeordnet ist.

IPv6-Adressen werden von den Ergebnissen des GetHostEntry Verfahrens gefiltert, wenn der lokale Computer installiert IPv6 nicht hat. Als Ergebnis ist es möglich, eine leere IPHostEntry Instanz zurück, wenn nur die Ergebnisse IPv6 falls verfügbar, für die Adressparameter.

Die Aliases-Eigenschaft der IPHostEntry Instanz zurückgegeben wird durch diese Methode nicht aufgefüllt und wird immer leer sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top