Dns.GetHostEntry peut-il jamais renvoyer un IPHostEntry avec une liste d’adresses vide?

Je me demande simplement s’il peut y avoir un cas où le nom d’hôte peut être résolu avec succès mais où hostEntry.AddressList est renvoyé.

Actuellement, je fais quelque chose comme ça:

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); 

Mon hypothèse est que Dns.GetHostEntry lève une exception si le nom d’hôte n’est pas trouvé ou sinon, AddressList n’est pas vide, mais je n’en suis pas sûr.

Non, vous ne verrez pas une liste d’adresses vide: même si vous interrogez une étiquette DNS qui existe, mais ne contient pas d’enregistrements A ou AAAA (IPv6), une exception SocketException (“Aucun hôte de ce type est connu”) sera émise.

Vous pouvez le vérifier en consultant la fonction InternalGetHostByName(ssortingng hostName, bool includeIPv6) dans DNS.cs à partir de la version .NET Reference Source. À l’exception de certaines précautions spécifiques à la plate-forme, les recherches DNS constituent un simple wrapper autour de la fonction gethostbyname de Winsock.

Gethostbyname va échouer ou renvoyer une liste d’adresses. Une liste d’adresses vide n’est jamais renvoyée, car la fonction échouera avec WSANO_DATA (“Nom valide, aucun enregistrement de données du type demandé”) dans ce cas, ce qui se traduit par l’exception de socket que nous avons déjà vue dans .NET.

EDIT, mai 2012, à la suite de réponses indiquant qu’une liste vide est renvoyée: notez que cette réponse ne s’applique qu’à Win32 et que des plates-formes telles que WinCE peuvent se comporter très différemment. Si vous constatez un comportement de “liste vide” sur Win32 et que la requête que vous effectuez concerne un serveur DNS public, envoyez votre code …

Juste pour les enregistrements.

Grâce à la réponse acceptée par mdb, j’ai jeté un coup d’œil à la description de l’erreur WSANO_DATA :

Le nom demandé est valide et a été trouvé dans la firebase database, mais les données associées correctes ne sont pas résolues. L’exemple habituel en est une tentative de traduction de nom d’hôte en adresse (à l’aide de gethostbyname ou WSAAsyncGetHostByName) qui utilise le DNS (serveur de noms de domaine). Un enregistrement MX est renvoyé mais aucun enregistrement A – indiquant que l’hôte existe, mais n’est pas directement accessible.

Donc, cela répond bien à ma question 🙂

Vous avez trois situations possibles ici:

  1. Le nom d’hôte existe (le DNS a un enregistrement A) et est résolu en adresse IP.

    • La condition n’est jamais atteinte
  2. Le nom d’hôte existe (le DNS connaît le domaine), mais aucun enregistrement A n’existe.

    • C’est un scénario extrêmement improbable, et je pense que cela ne peut jamais se produire en premier lieu.
  3. Le nom d’hôte n’existe pas

    • Une exception est lancée, vous n’y arrivez jamais.

Donc non, je ne pense pas que cela puisse jamais arriver.

La réponse est oui . La méthode GetHostEntry interroge un serveur DNS sur les adresses IP et les alias associés à une adresse IP.

Les adresses IPv6 sont filtrées des résultats de la méthode GetHostEntry si IPv6 n’est pas installé sur l’ordinateur local. Par conséquent, il est possible de récupérer une instance IPHostEntry vide si seuls les résultats IPv6 étaient disponibles pour le paramètre address.

La propriété Aliases de l’instance IPHostEntry renvoyée n’est pas renseignée par cette méthode et sera toujours vide.