2012-06-06 14 views
6

Non riesco a trovare alcuna descrizione appropriata nella documentazione per ciò che effettivamente fa.Cosa fa effettivamente il metodo Dns.GetHostEntry (String)?

Verifica l'esistenza di record A o record CNAME o entrambi?

La mia comprensione è che in .NET 4, questo genera un SocketException se l'host non esiste, e questo è confermato dal mio test.

risposta

7

Questa è la lista di indirizzi restituita da

var ips = System.Net.Dns.GetHostEntry("microsoft.com").AddressList; 
foreach (var ip in ips) 
    Console.WriteLine(ip); 

// output 
64.4.11.37 
65.55.58.201 

E questi sono i record A tirati da network-tools.com, query DNS.

Answer records 
microsoft.com  A 64.4.11.37 
microsoft.com  A 65.55.58.201 

Quindi direi che tira record A.

+0

Grazie per una risposta molto migliore. –

+0

Ecco la libreria C# open-source che uso per le query DNS, http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component che ho trovato da questa domanda, http: // stackoverflow.com/questions/1061248/getting-ns-record-type-using-c-sharp-dns/1061268#comment12106649_1061268 – Despertar

+0

perfetto! perfetto in tutto! –

4

Dns.GetHostEntry è costruito sopra l'API di Windows e non utilizza direttamente il protocollo DNS. Se IPv6 è abilitato chiamerà getaddrinfo. Altrimenti chiamerà lo gethostbyaddr. Queste funzioni possono utilizzare il file locale %SystemRoot%\System32\drivers\etc\hosts, DNS o anche NETBIOS per risolvere un nome host in un indirizzo IP. La risoluzione di un nome host in un indirizzo IP utilizzando DNS utilizzerà i record CNAME per trovare il record A.

È possibile verificare questo risolvendo www.google.com che almeno al momento ha un record CNAME che punta a www.l.google.com. L'utilizzo di Dns.GetHostEntry restituirà gli indirizzi IP dai record A per www.l.google.com.

+0

Giusto, quindi stai dicendo che utilizza entrambi i record CNAME e A in quanto segue i record CNAME per trovare i record A. E l'incapacità di trovare qualsiasi record A getterebbe SocketException? –

+0

Non sono sicuro della parte CNAME. Dopo tutto, solo i sottodomini utilizzano CNAME per mappare domini completamente qualificati (ftp.domain.com CNAME domain.com). Tuttavia domain.com stesso deve avere un record A, quindi come funzionerebbe con Dns.GetHostEntry ("dominio.com")? Ho appena testato il GetHostEntry() con due dei miei sottodomini, ognuno ha un record A che punta a un server diverso e GetHostEntry restituito quelli di Ip e se cambio questi record A sono sicuro che cambierà i risultati di GetHostEntry(). Google.com è il sito più frequentato al mondo, quindi non credo che sia un buon punto di riferimento per il gusto delle coerenze. – Despertar

+0

@GregT: fare un piccolo test è probabilmente il modo migliore per rispondere alla tua domanda. Non sono sicuro di come 'getaddrinfo' si comporti se c'è un record CNAME che non punta a un record A. Tuttavia, il codice sorgente di 'Dns.GetHostEntry' è pubblicamente disponibile e fino ad ora posso vedere che un errore di socket sarà racchiuso in un' SocketException'. –

Problemi correlati