2012-06-06 17 views
6

No puedo encontrar ninguna descripción adecuada en la documentación de lo que realmente hace.¿Qué hace realmente el método Dns.GetHostEntry (String)?

¿Comprueba la existencia de registros A o registros CNAME o ambos?

Mi entendimiento es que en .NET 4, esto arroja una excepción SocketException si el host no existe, y esto es confirmado por mis pruebas.

Respuesta

7

Ésta es la lista de direcciones devuelta por

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 

y estos son los registros A extraídos de network-tools.com, consulta DNS.

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

Así que yo diría que tira de los registros A.

+0

Gracias por una respuesta mucho mejor. –

+0

Aquí está la biblioteca de código abierto, C# que uso para las consultas DNS, http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component que encontré en esta pregunta, http: // stackoverflow.com/questions/1061248/getting-ns-record-type-using-c-sharp-dns/1061268#comment12106649_1061268 – Despertar

+0

¡perfecto! perfecto en todo! –

4

Dns.GetHostEntry se basa en la API de Windows y no utiliza el protocolo DNS directamente. Si IPv6 está habilitado, llamará al getaddrinfo. De lo contrario, llamará al gethostbyaddr. Estas funciones pueden usar el archivo local %SystemRoot%\System32\drivers\etc\hosts, DNS o incluso NETBIOS para resolver un nombre de host en una dirección IP. La resolución de un nombre de host a una dirección IP utilizando DNS utilizará registros CNAME para encontrar el registro A.

Puede probar esto resolviendo www.google.com que al menos ahora tiene un registro CNAME que apunta a www.l.google.com. El uso de Dns.GetHostEntry devolverá las direcciones IP de los registros A para www.l.google.com.

+0

Correcto, entonces dice que usa los registros CNAME y A porque sigue los registros CNAME para encontrar los registros A. ¿Y el hecho de no encontrar ningún registro A arrojaría la SocketException? –

+0

No estoy seguro acerca de la parte CNAME. Después de todos los únicos subdominios, use CNAME para mapear dominios completamente calificados (ftp.domain.com CNAME domain.com). Sin embargo, domain.com mismo debe tener un registro A, entonces, ¿cómo funcionaría eso con Dns.GetHostEntry ("dominio.com")? Acabo de probar GetHostEntry() con dos de mis subdominios, cada uno tiene un registro A que apunta a un servidor diferente y GetHostEntry devolvió esos Ip y si cambio esos registros A, estoy seguro de que cambiarán los resultados de GetHostEntry(). Google.com es el sitio más activo del mundo, por lo que no creo que sea un buen punto de referencia por cuestiones de coherencia. – Despertar

+0

@GregT: Hacer una pequeña prueba es probablemente la mejor manera de responder a su pregunta. No estoy seguro de cómo 'getaddrinfo' se comporta si hay un registro CNAME que no apunta a un registro A. Sin embargo, el código fuente para 'Dns.GetHostEntry' está públicamente disponible y, en la medida en que pueda ver, un error de socket se ajustará a' SocketException'. –

Cuestiones relacionadas