2012-10-06 6 views
10

Ich versuche, eine TCP-Socket-Verbindung zu einer IP-Adresse zu machen. Ich kann dies tun, indem direkt eine IP-Adresse wie folgt Parsen:Auflösen einer IP-Adresse von DNS in 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! 

aber ich kann nicht herausfinden, wie von einem DNS-String diese IP-Adresse prophezeien. Ich habe jede Kombination der folgenden versucht:

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? 

Würde jemand von euch Art Seelen hat einen Tipp, mir zu helfen eine IPAddress aus einem DNS-Squeeze? nur

Antwort

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

oder einfach IPAddress address = Dns.GetHostAddresses("www.mydns.org")[0];, wenn Sie die erste möchten.

+0

Sie mein Herr, ein Assistent. Vielen Dank. – Nanomurf

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

Einfach Adresse aufzählen durch GetHostEntry Aufruf, auf Sucess bricht die Schleife

3

ich dafür nur eine sehr gepflegte Erweiterungsmethode habe!

Ich berücksichtige, dass ein IPV6 als erste Adresse in der Liste der von der DNS-Klasse zurückgegebenen Adressen zurückgegeben werden kann und Sie ein IPV6 oder IPV4 auf das Ergebnis "favorisieren" können. Hier ist die vollständig dokumentiert Klasse (nur mit dem entsprechenden Verfahren für diesen Fall aus Gründen der Kürze):

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

Vergessen Sie nicht, diese Klasse in einem Namespace zu setzen! :-)

Jetzt können Sie einfach tun:

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 
Verwandte Themen