Dns.GetHostEntry può mai restituire un IPHostEntry con un AddressList vuoto?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Mi chiedo solo se può esserci un caso in cui il nome host può essere risolto con successo ma l'hostEntry.AddressList restituito è vuoto.

Attualmente sto facendo qualcosa del genere:

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

La mia ipotesi è che Dns.GetHostEntry genera un'eccezione se il nome host non viene trovato o altrimenti la AddressList non è vuota, ma non ne sono sicuro.

È stato utile?

Soluzione

No, non vedrai un elenco di indirizzi vuoto: anche se esegui una query su un'etichetta DNS che esiste, ma non ha record A o AAAA (IPv6), SocketException (" No Such Host is Known ") essere lanciato.

Puoi verificarlo guardando la funzione InternalGetHostByName (string hostName, bool includeIPv6) in DNS.cs dalla versione di origine di riferimento .NET. Con l'eccezione di alcune precauzioni specifiche della piattaforma, le ricerche DNS sono un semplice wrapper attorno a Winsock gethostbyname .

Gethostbyname non riuscirà o restituirà un elenco di indirizzi. Un elenco di indirizzi vuoto non viene mai restituito, poiché la funzione non riuscirà con WSANO_DATA (" Nome valido, nessun record di dati del tipo richiesto ") in questo caso, che si traduce nell'eccezione socket che abbiamo già visto in .NET.

EDIT maggio 2012, spinto da risposte che affermano che viene comunque restituito un elenco vuoto: si noti che questa risposta si applica solo a Win32 e che piattaforme come WinCE possono comportarsi in modo abbastanza diverso. Se visualizzi un comportamento "elenco vuoto" su Win32 e la richiesta che stai facendo è relativa a un server DNS disponibile pubblicamente, pubblica il tuo codice ...

Altri suggerimenti

Solo per i record.

Grazie alla risposta accettata Ho dato un'occhiata alla dell'errore WSANO_DATA :

  

Il nome richiesto è valido ed è stato trovato nel database, ma lo è   per cui non sono stati risolti i dati associati corretti. Il solito esempio   per questo è un tentativo di traduzione da nome a indirizzo dell'host (usando gethostbyname o   WSAAsyncGetHostByName) che utilizza il DNS (Domain Name Server). Un record MX   viene restituito ma nessun record A & # 8212; indica che l'host stesso esiste, ma non lo è   direttamente raggiungibile.

Quindi questo risponde praticamente alla mia domanda :)

Hai tre possibili situazioni qui:

  1. Il nome host esiste (DNS ha un record A) e si risolve in un indirizzo IP

    • La condizione non viene mai raggiunta
  2. Il nome host esiste (DNS conosce il dominio) ma non esiste alcun record A.

    • Questo è uno scenario estremamente improbabile e penso che ciò non possa mai accadere in primo luogo.
  3. Il nome host non esiste

    • Viene generata un'eccezione, non ci si arriva mai.

Quindi no, non penso che possa mai accadere.

La risposta è . Il metodo GetHostEntry richiede a un server DNS gli indirizzi IP e gli alias associati a un indirizzo IP.

Gli indirizzi IPv6 vengono filtrati dai risultati del metodo GetHostEntry se nel computer locale non è installato IPv6. Di conseguenza, è possibile recuperare un'istanza IPHostEntry vuota se solo i risultati IPv6 erano disponibili per il parametro address.

La proprietà Alias ??dell'istanza IPHostEntry restituita non è popolata da questo metodo e sarà sempre vuota.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top