如何确定本地主机的IPv4地址?

问题描述 投票:29回答:11

我怎样才能从Internet Protocol version 4获得Dns.GetHostAddresses()地址?我有下面的代码,它给我IPv4和IPv6地址。我必须使用具有多个IPv4地址的盒子。

IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
private void get_IPs()
    {
        foreach (IPAddress a in localIPs)
        {
           server_ip = server_ip + a.ToString() + "/";
        }
    }
c# ip-address ipv4
11个回答
0
投票

这是我的代码。并且可以在许多LAN卡上找到它。

private string GetLocalIpAddress()
{
    string localIpAddress = string.Empty;
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface nic in nics)
    {
        if (nic.OperationalStatus != OperationalStatus.Up)
        {
            continue;
        }

        IPv4InterfaceStatistics adapterStat = (nic).GetIPv4Statistics();
        UnicastIPAddressInformationCollection uniCast = (nic).GetIPProperties().UnicastAddresses;

        if (uniCast != null)
        {
            foreach (UnicastIPAddressInformation uni in uniCast)
            {
                if (adapterStat.UnicastPacketsReceived > 0
                    && adapterStat.UnicastPacketsSent > 0
                    && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                {
                    if (uni.Address.AddressFamily == AddressFamily.InterNetwork)
                    {
                        localIpAddress = nic.GetIPProperties().UnicastAddresses[0].Address.ToString();

                        break;
                    }
                }
            }
        }
    }

    return localIpAddress;
}

0
投票

以下是使用for循环查找第一个连接的IPv4的代码:

        IPAddress ipAddress = null;
        IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());           

        for (int i=0 ; i<localIPs.Length ; i++)
        {
            if (localIPs[i].AddressFamily == AddressFamily.InterNetwork)
            {
                ipAddress = localIPs[i];
                break;
            }                
        }

11
投票

这是我使用的一个功能:

public static string GetIP4Address()
{
    string IP4Address = String.Empty;

    foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
    {
        if (IPA.AddressFamily == AddressFamily.InterNetwork)
        {
            IP4Address = IPA.ToString();
            break;
        }
    }

    return IP4Address;
}

作为一个可枚举的:

public static IEnumerable<string> GetIP4Addresses()
{
    return Dns.GetHostAddresses(Dns.GetHostName())
        .Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork)
        .Select(x => x.ToString());
}

7
投票

使用Linq时非常干净和甜美

IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();

4
投票

locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)


4
投票

来自MSDN on Dns.GetHostAddresses

当空字符串作为主机名传递时,此方法返回除Windows Server 2003以外的所有操作系统的本地主机的IPv4地址。对于Windows Server 2003,将返回本地主机的IPv4和IPv6地址。

如果本地计算机未安装IPv6,则会从GetHostAddresses方法的结果中过滤IPv6地址。因此,如果只有IPv6结果可用于hostNameOrAddress.parameter,则可以返回空的IPAddress实例。

所以,你可以用它来try and parse it

IPAddress.TryParse

然后检查AddressFamily哪个

返回IPv4的System.Net.Sockets.AddressFamily.InterNetwork或IPv6的System.Net.Sockets.AddressFamily.InterNetworkV6。

string input = "192.168.0.10";

IPAddress address;
if (IPAddress.TryParse(input, out address))
{
    switch (address.AddressFamily)
    {
        case System.Net.Sockets.AddressFamily.InterNetwork:
            // we have IPv4
            break;
        case System.Net.Sockets.AddressFamily.InterNetworkV6:
            // we have IPv6
            break;
        default:
            // do something else
            break;
    }
}

1
投票

我用了开头的答案

/// <summary> and it mostly worked:
//for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork
    if (address.Address.AddressFamily != AddressFamily.InterNetwork) 

我不得不使用:

if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)

但我实际使用过:

if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork))

另外,我补充说:

if (network.OperationalStatus != OperationalStatus.Up)
                continue;

因为有些网络不起作用而且不应该在那里,我确实看到它们在注册表中。 ---阿尔文


0
投票

我使用这个帮助方法,在过滤掉IPV6和Loopback一次后返回第一个活动的IPV4地址


    public static IPAddress GetLocalIPAddress()
    {
        IPAddress result = null;
        IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress[] ipv4Address = Array.FindAll(iphostentry.AddressList, add => add.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(add));
        if (ipv4Address.Length > 0 )
        {
            result =ipv4Address[0];
        }
        return result;
    }

0
投票

对我来说,更清洁的解决方案是:

 public static string GetLocalIP() 
        {
            string ipv4Address = String.Empty;

            foreach (IPAddress currentIPAddress in Dns.GetHostAddresses(Dns.GetHostName()))
            {
                if (currentIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    ipv4Address = currentIPAddress.ToString();
                    break;
                }
            }

            return ipv4Address;
        }
© www.soinside.com 2019 - 2024. All rights reserved.