Domanda

SU Msdn menziona GetHostByName è obsoleto. La sostituzione è GetHostEntry. Quali sono la loro differenza?

È stato utile?

Soluzione

Sembra che Getostentry faccia un po 'più di errore e supporti anche Tracciamento di rete

Gethostbyname decompilato:

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

Getostentry decompilato:

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

Altri suggerimenti

In primo luogo, è importante riconoscere che si tratta di involucri della libreria UNIX Socket, che espone le funzioni inet_aton (equivalente a IPAddress.Parse), gethostbyname (Avvolto da Dns.GetHostByName) e gethostbyaddr (Avvolto da Dns.GetHostByAddress). Microsoft ha successivamente aggiunto il Dns.GetHostEntry funzione di utilità basata su questi.

Dopo aver riflettuto sulla differenza filosofica tra Dns.GetHostByName e Dns.GetHostEntry, Sono giunto alla conclusione che Microsoft ha deciso che l'API principale che espongono per le ricerche DNS dovrebbero provare a restituire solo voci DNS effettive.

A livello di prese unix, gethostbyname può prendere un indirizzo IP o un nome host. È esplicitamente documentato come analizzazione dell'indirizzo IP se è quello che fornisci. Ma è anche esplicitamente documentato come solo indirizzi IPv4 a supporto. Pertanto, gli sviluppatori sono incoraggiati a utilizzare la funzione getaddrinfo Invece, che fa anche una ricerca più complessa che coinvolge il servizio a cui si desidera connetterti e che supporta le famiglie indirizzate diverse da IPv4.

Microsoft ha adottato un approccio diverso nel loro wrapper. Considerano ancora GetHostByName Per essere deprecati, ma invece di legare la ricerca di un database di servizi, hanno deciso di creare una funzione che restituisca la voce dell'host DNS fisica effettiva che chiedi. Non è abbastanza che forse si fornisce una stringa con un indirizzo valido, se allora non c'è voce DNS GetHostEntry fallirà, perché questo è il suo intero scopo. Pertanto, se si passa un nome host in GetHostEntry, esegue una ricerca DNS in avanti e se si passa un indirizzo IP in GetHostEntry, esegue una ricerca DNS inversa. Ad ogni modo, la struttura restituita ti dirà sia il nome di ingresso DNS che l'indirizzo associato - ma Se non esiste una voce associata, l'unica cosa che ricevi è un errore.

Se stai cercando di gestire l'input dell'utente che fornisce un target per la connessione, GetHostEntry Non è realmente adatto, perché se gli utenti tipi in un indirizzo IP ad hoc, potrebbe non riuscire a risolverlo anche se, poiché è un indirizzo IP, hai tutto il necessario per stabilire una connessione. GetHostByName è esattamente la funzione di cui hai bisogno in questo caso, ma Microsoft ha scelto di deprecarla. Data la deprecazione, il linguaggio sarà quello di replicare l'approccio "prova a analizzare prima" che @faisai mansoor ha mostrato nel decompilato GetHostByName funzione:

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

Questo utilizza i dettagli di implementazione interna del Dns classe, ma lo spirito è facile da replicare nel tuo codice, ad esempio:

if (!IPAddress.TryParse(userInput, out var addressToWhichToConnect))
  addressToWhichToConnect = Dns.GetHostEntry(userInput).AddressList.First();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top