从Dns.GetHostEntry()获取IPv4地址

时间:2009-06-29 17:38:28

标签: c# .net dns ipv6 ipv4

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

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

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

从任何其他IPv4计算机ping机器会提供良好的IPv4地址...并且从其自身执行“ping -4 machinename”会提供正确的IPv4地址....但是经常ping它从它本身给出“:: 1:”。

如何从本身获取此机器的IPv4?

7 个答案:

答案 0 :(得分:63)

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

答案 1 :(得分:43)

查找所有本地IPv4地址:

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

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

答案 2 :(得分:9)

IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);

答案 3 :(得分:6)

    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 并用于表格的任何功能。

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:-3)

的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()