2012-10-06 11 views
10

Estoy tratando de hacer una conexión de socket TCP a una dirección IP. Puedo hacer esto mediante el análisis directamente una dirección IP como esto:Resolviendo una dirección IP de DNS en C#

IPAddress ipAddress = IPAddress.Parse("192.168.1.123"); 
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 80); 
// Create a TCP/IP socket. 
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // This works! 

Sin embargo, no puedo encontrar la manera de adivinar la dirección IP de una cadena de DNS. He probado todas las combinaciones de lo siguiente:

IPAddress ipAddress = Dns.Resolve("www.mydns.org"); // No dice 
IPAddress ipAddress = Dns.GetHostEntry("www.mydns.org"); // Nada 
IPAddress ipAddress = IPAddress.Parse(Dns.Resolve("www.mydns.org")); // So many errors... 
IPAddress ipAddress = IPAddress.Parse(Dns.Resolve("www.mydns.org").toString()); // WTh is this attempt anyway? 

¿Alguno de ustedes, almas amables tener una punta que me ayude a apretar una Dirección IP de un DNS?

Respuesta

12
foreach (IPAddress ip in Dns.GetHostAddresses("www.mydns.org")) 
{ 
    Console.WriteLine(ip.ToString()); 
} 

o simplemente IPAddress address = Dns.GetHostAddresses("www.mydns.org")[0]; si desea que sólo el primero.

+0

Usted sir, es un mago. Gracias. – Nanomurf

2
IPHostEntry entry = Dns.GetHostEntry(hostNameOrAddress: "www.google.com"); 
foreach (IPAddress addr in entry.AddressList) 
{ 
    // connect, on sucess call 'break' 
} 

simplemente enumeran electrónico llamando GetHostEntry, el éxito romper el bucle

3

Tengo un método de extensión muy ordenado para eso!

Tengo en cuenta que un IPV6 puede ser devuelto como la primera dirección en la lista de direcciones devuelta por la clase DNS y le permite "favorecer" un IPV6 o IPV4 en el resultado. Esta es la clase totalmente documentado (sólo con el método pertinente para este caso por razones de brevedad):

using System; 
using System.Linq; 
using System.Net; 
using System.Net.Sockets; 

/// <summary> 
/// Basic helper methods around networking objects (IPAddress, IpEndPoint, Socket, etc.) 
/// </summary> 
public static class NetworkingExtensions 
{ 
    /// <summary> 
    /// Converts a string representing a host name or address to its <see cref="IPAddress"/> representation, 
    /// optionally opting to return a IpV6 address (defaults to IpV4) 
    /// </summary> 
    /// <param name="hostNameOrAddress">Host name or address to convert into an <see cref="IPAddress"/></param> 
    /// <param name="favorIpV6">When <code>true</code> will return an IpV6 address whenever available, otherwise 
    /// returns an IpV4 address instead.</param> 
    /// <returns>The <see cref="IPAddress"/> represented by <paramref name="hostNameOrAddress"/> in either IpV4 or 
    /// IpV6 (when available) format depending on <paramref name="favorIpV6"/></returns> 
    public static IPAddress ToIPAddress(this string hostNameOrAddress, bool favorIpV6=false) 
    { 
     var favoredFamily = favorIpV6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork; 
     var addrs = Dns.GetHostAddresses(hostNameOrAddress); 
     return addrs.FirstOrDefault(addr => addr.AddressFamily == favoredFamily) 
       ?? 
       addrs.FirstOrDefault(); 
    } 
} 

No se olvide de poner esta clase dentro de un espacio de nombres! :-)

Ahora usted puede simplemente hacer esto:

var server = "http://simpax.com.br".ToIPAddress(); 
var blog = "http://simpax.codax.com.br".ToIPAddress(); 
var google = "google.com.br".ToIPAddress(); 
var ipv6Google = "google.com.br".ToIPAddress(true); // if available will be an IPV6