52

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

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

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

从任何其他 IPv4 机器 ping 机器会得到一个好的 IPv4 地址……并且从它自己执行“ping -4 machinename”会给出正确的 IPv4 地址……但是从它自己定期 ping 它会得到“::1:”。

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

4

8 回答 8

67

您是否查看了返回中的所有地址,丢弃了InterNetworkV6 家族的地址,只保留了 IPv4 的地址?

于 2009-06-29T17:50:37.830 回答
50

要查找所有本地 IPv4 地址:

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

或使用Array.Find,或者Array.FindLast如果你只想要一个。

于 2011-04-15T17:19:00.370 回答
10
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
于 2016-03-21T21:04:56.917 回答
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 并在表单的任何函数中使用。

于 2010-10-15T08:43:35.103 回答
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;
    }
于 2015-02-05T21:33:33.420 回答
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();
}
于 2013-03-14T06:48:40.033 回答
0

您可以使用以下代码从 DNS获取所有IPv4 地址:

IPs[] ipv4Addresses = Array.FindAll(
           Dns.GetHostEntry(string.Empty).AddressList,
           address => address.AddressFamily == AddressFamily.InterNetwork);
于 2022-02-18T13:15:26.437 回答
-4

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

于 2015-02-19T21:12:11.923 回答