2012-10-06 10 views
10

IPアドレスにTCPソケット接続をしようとしています。C#でDNSからIPアドレスを解決する

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! 

しかし、私はこのIPアドレスをDNS文字列からどのように分類するのか分かりません。私は、次のすべての組み合わせを試してみた:

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? 

あなたのあらゆる種類の魂が、私はDNSの出たIPAddressを絞るのに役立つヒントを持っていますか?

答えて

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

または単にIPAddress address = Dns.GetHostAddresses("www.mydns.org")[0];の場合は、最初のもののみが必要です。

+0

あなたの先生を、ウィザードがあります。ありがとうございました。 – Nanomurf

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

単に、GetHostEntryを呼び出すことでアドレスを列挙成功事例の上で、私はちょうどそれのために非常にきちんとした拡張メソッドを持っているループ

3

を破ります!

私は、IPV6がDNSクラスによって返されたアドレスのリストの最初のアドレスとして返され、結果にIPV6またはIPV4を「優先」できることを考慮します。ここでは、完全に文書化されたクラスは、(のみ簡略化の理由のために、この場合の適切な方法で)です:

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

は、名前空間内でこのクラスを置くことを忘れないでください! :-)

は今、あなたは、単にこれを行うことができます:

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 
関連する問題