【问题标题】:Get IPv4 addresses from Dns.GetHostEntry()从 Dns.GetHostEntry() 获取 IPv4 地址
【发布时间】:2010-11-06 18:26:30
【问题描述】:

我这里有一些代码在 IPv4 机器上运行良好,但在我们的构建服务器(IPv6)上却失败了。简而言之:

IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);

GetHostEntry 的文档说传入 string.Empty 将为您获取 localhost 的 IPv4 地址。这就是我要的。问题是它在我们的 IPv6 机器上返回字符串“::1:”,我认为它是 IPv6 地址。

从任何其他 IPv4 机器上 ping 机器会得到一个好的 IPv4 地址...并从自身执行 "ping -4 machinename" 会得到正确的 IPv4 地址...。但定期 ping 它from 本身给出“::1:”。

我怎样才能从它本身获得这台机器的 IPv4?

【问题讨论】:

    标签: c# .net dns ipv6 ipv4


    【解决方案1】:
    IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
    IPAddress ipAddress = ipHostInfo.AddressList
        .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
    

    【讨论】:

    • 不幸的是,VirtualBox 地址是我机器上计算机 IP 地址之前的地址。我无法选择真实的 IP 地址,因为两者都有“InterNetwork”标志。
    【解决方案2】:

    IPv6

    lblIP.Text = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(0).ToString()


    IPv4

    lblIP.Text = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(1).ToString()

    【讨论】:

    • System.Net.Dns.GetHostName 是一种方法,而不是属性。
    • 可以得到2个ipv6,0不等于ipv4,可以是另外一组ipv6
    【解决方案3】:
        public static string GetIPAddress(string hostname)
        {
            IPHostEntry host;
            host = Dns.GetHostEntry(hostname);
    
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    //System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip);
                    return ip.ToString();
                }
            }
            return string.Empty;
        }
    

    【讨论】:

      【解决方案4】:

      要查找所有有效的地址列表,这是我使用的代码

      public static IEnumerable<string> GetAddresses()
      {
            var host = Dns.GetHostEntry(Dns.GetHostName());
            return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
      }
      

      【讨论】:

        【解决方案5】:
            public Form1()
            {
                InitializeComponent();
        
                string myHost = System.Net.Dns.GetHostName();
                string myIP = null;
        
                for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
                {
                    if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
                    {
                        myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString();
                    }
                }
            }
        

        在公共变量中声明 myIP 和 myHost 并在表单的任何功能中使用。

        【讨论】:

          【解决方案6】:

          要查找所有本地 IPv4 地址:

          IPAddress[] ipv4Addresses = Array.FindAll(
              Dns.GetHostEntry(string.Empty).AddressList,
              a => a.AddressFamily == AddressFamily.InterNetwork);
          

          如果您只想要一个,请使用Array.FindArray.FindLast

          【讨论】:

          • @NahumLitvin 但这不是 linq?
          • @lukazoid 不是。我的意思可能是 lambda 表达式
          【解决方案7】:

          您是否在返回中查看了all the addresses,丢弃了family InterNetworkV6 的那些并只保留了IPv4 的那些?

          【讨论】:

          • 我的电话只返回 ipv6,没有 ipv4 条目。如果我在 PowerShell 中执行 Resolve-DnsName -Type A,我会返回 IPv4(在这种情况下它返回的默认类型是 AAAA)。
          • @subkamran 请将此作为单独的问题,而不是作为评论提出
          • 这是由于我的公司 PC 上的直接访问。无视。
          • 为什么我们不能使用 IPv6?
          • @StormMuller 因为 OP 询问“获取 IPv4 地址...”
          猜你喜欢
          • 2016-09-20
          • 2017-04-16
          • 2010-11-19
          • 1970-01-01
          • 2014-08-31
          • 2013-06-21
          • 1970-01-01
          • 2015-07-24
          • 1970-01-01
          相关资源
          最近更新 更多