Question

Sur MSDN il mentionne GetHostByName est obsolète.Le remplacement est GetHostEntry.Quelle est leur différence?

Était-ce utile?

La solution

Il ressemble à GetHostEntry fait un peu plus de la vérification des erreurs et prend également en charge Effectuer Le Suivi Du Réseau

GetHostByName Décompilé:

public static IPHostEntry GetHostByName(string hostName)
{
  if (hostName == null)
    throw new ArgumentNullException("hostName");
  Dns.s_DnsPermission.Demand();
  IPAddress address;
  if (IPAddress.TryParse(hostName, out address))
    return Dns.GetUnresolveAnswer(address);
  else
    return Dns.InternalGetHostByName(hostName, false);
}

GetHostEntry Décompilé:

public static IPHostEntry GetHostEntry(string hostNameOrAddress)
{
  if (Logging.On)
    Logging.Enter(Logging.Sockets, "DNS", "GetHostEntry", hostNameOrAddress);
  Dns.s_DnsPermission.Demand();
  if (hostNameOrAddress == null)
    throw new ArgumentNullException("hostNameOrAddress");
  IPAddress address;
  IPHostEntry ipHostEntry;
  if (IPAddress.TryParse(hostNameOrAddress, out address))
  {
    if (((object) address).Equals((object) IPAddress.Any) || ((object) address).Equals((object) IPAddress.IPv6Any))
      throw new ArgumentException(SR.GetString("net_invalid_ip_addr"), "hostNameOrAddress");
    ipHostEntry = Dns.InternalGetHostByAddress(address, true);
  }
  else
    ipHostEntry = Dns.InternalGetHostByName(hostNameOrAddress, true);
  if (Logging.On)
    Logging.Exit(Logging.Sockets, "DNS", "GetHostEntry", (object) ipHostEntry);
  return ipHostEntry;
}

Autres conseils

Tout d'abord, il est important de reconnaître que ces sont des wrappers de la socket UNIX bibliothèque, qui expose les fonctions inet_aton (équivalent à IPAddress.Parse), gethostbyname (enveloppé par Dns.GetHostByName) et gethostbyaddr (enveloppé par Dns.GetHostByAddress).Microsoft a par la suite ajouté le Dns.GetHostEntry la fonction d'utilité sur la base de ces.

Après méditer la différence philosophique entre Dns.GetHostByName et Dns.GetHostEntry, Je suis venu à la conclusion que Microsoft a décidé que le principal de l'API, ils exposent pour les recherches DNS devrait être d'essayer de retourner seulement réelle entrées DNS.

À la sockets UNIX niveau, gethostbyname peut prendre une adresse IP ou un nom d'hôte.Il est explicitement documentées que l'analyse de l'adresse IP si c'est ce que vous offre.Mais il est aussi explicitement décrite comme ne supportant des adresses IPv4.En tant que tel, les développeurs sont encouragés à utiliser la fonction getaddrinfo au lieu de cela, ce qui est plus complexe de recherche impliquant le service que vous souhaitez vous connecter en tant que bien, et qui soutient les familles d'adresses autres que l'IPv4.

Microsoft a pris une approche différente dans leur emballage.Ils continuent de penser que GetHostByName à être obsolète, mais au lieu de lier la recherche à une base de données des services, ils ont décidé de créer une fonction qui renvoie le nombre physique de l'hôte DNS entrée que vous demandez.Il ne suffit pas que vous avez peut-être fournir une chaîne de caractères avec une adresse valide, s'il n'y a aucune entrée DNS puis GetHostEntry sera un échec, car c'est son but en entier.Ainsi, si vous passez un nom d'hôte dans GetHostEntry, il effectue un DNS lookup, et si vous passez une adresse IP dans GetHostEntry, il effectue une recherche DNS inversée.De toute façon, la structure retournée vais vous dire à la fois l'entrée DNS nom et l'adresse associée -- mais si il n'y a pas de entrée associée, la seule chose que vous obtenez en retour est une erreur.

Si vous êtes à la recherche pour gérer la saisie de l'utilisateur qui fournit une cible pour la connexion, GetHostEntry n'est pas vraiment approprié, car si l'utilisateur tape dans une ad hoc de l'adresse IP, il peut ne parviennent pas à résoudre, même si, puisque c'est une adresse IP, vous avez tout ce dont vous avez besoin pour établir une connexion. GetHostByName est exactement la fonction que vous avez besoin dans ce cas, mais Microsoft ont choisi de rendre caduque elle.Compte tenu de la dépréciation, l'idiome va être à reproduire le "essayer d'analyser d'abord" que @Faisai Mansoor a montré dans le décompilé GetHostByName fonction:

// Microsoft's internal code for GetHostByName:
if (IPAddress.TryParse(hostName, out address))
  return Dns.GetUnresolveAnswer(address);
else
  return Dns.InternalGetHostByName(hostName, false);

Cette utilise en interne le détails de mise en œuvre de la Dns de la classe, mais l'esprit de la il est facile à reproduire dans votre propre code, par exemple:

if (!IPAddress.TryParse(userInput, out var addressToWhichToConnect))
  addressToWhichToConnect = Dns.GetHostEntry(userInput).AddressList.First();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top