15

IPアドレスにTCPソケット接続しようとしています。これを行うには、次のように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!

ただし、DNS文字列からこのIPアドレスを区別する方法がわかりません。私は次のすべての組み合わせを試しました:

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からIPアドレスを絞り出すのに役立つヒントはありますか?

4

3 に答える 3

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

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

于 2012-10-06T03:02:57.640 に答える
10

そのための非常に優れた拡張方法があります。

DNSクラスによって返されるアドレスのリストの最初のアドレスとしてIPV6が返される可能性があることを考慮に入れて、結果で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
于 2013-05-28T21:05:04.243 に答える
2
IPHostEntry entry = Dns.GetHostEntry(hostNameOrAddress: "www.google.com");
foreach (IPAddress addr in entry.AddressList)
{
    // connect, on sucess call 'break'
}

GetHostEntryを呼び出してアドレスを列挙するだけで、成功するとループが解除されます

于 2012-10-06T03:09:53.600 に答える