从 Dns.GetHostEntry() 获取 IPv4 地址

Posted

技术标签:

【中文标题】从 Dns.GetHostEntry() 获取 IPv4 地址【英文标题】:Get IPv4 addresses from Dns.GetHostEntry() 【发布时间】: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?

【问题讨论】:

【参考方案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 地址...”

以上是关于从 Dns.GetHostEntry() 获取 IPv4 地址的主要内容,如果未能解决你的问题,请参考以下文章

Dns.GetHostAddress和Dns.GetHostEntry都只返回ipv4地址。我如何获得ipv4和ipv6地址?

获取本机IP地址

获取电脑的网络连接状态IPHost

获取电脑的网络连接状态IPHost

获取本机IP

获取本地主机IP地址[重复]