【问题标题】:Resolving an IP address from DNS in C# [duplicate]在 C# 中从 DNS 解析 IP 地址 [重复]
【发布时间】:2012-09-27 04:52:28
【问题描述】:

我正在尝试建立一个到 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 地址吗?

【问题讨论】:

    标签: c# ip-address


    【解决方案1】:
    foreach (IPAddress ip in Dns.GetHostAddresses("www.mydns.org"))
    {
        Console.WriteLine(ip.ToString());
    }
    

    如果你只想要第一个,或者只是IPAddress address = Dns.GetHostAddresses("www.mydns.org")[0];

    【讨论】:

    • 您也可以使用 LINQ 获得第一个:Net.Dns.GetHostAddresses(Name).First()。请注意,如果找不到主机名,则会抛出 SocketException
    【解决方案2】:

    我有一个非常简洁的扩展方法!

    我考虑到 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
    

    【讨论】:

    • 很好的答案,应该是被选中的。
    【解决方案3】:
    IPHostEntry entry = Dns.GetHostEntry(hostNameOrAddress: "www.google.com");
    foreach (IPAddress addr in entry.AddressList)
    {
        // connect, on sucess call 'break'
    }
    

    通过调用GetHostEntry简单地枚举地址,成功时打破循环

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2021-10-08
      • 2018-06-04
      • 2011-01-10
      • 2015-09-14
      • 2013-06-29
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多