Подтвердить что ты не робот

Как определить адреса локальных хостов IPv4?

Как получить только Протокол Интернета версии 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() + "/";
        }
    }
4b9b3361

Ответ 1

добавьте что-то вроде этого в свой код

  if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
  // IPv4 address

Ответ 2

Из мой блог:

/// <summary> 
/// This utility function displays all the IP (v4, not v6) addresses of the local computer. 
/// </summary> 
public static void DisplayIPAddresses() 
{ 
    StringBuilder sb = new StringBuilder(); 

    // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection) 
    NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); 

    foreach (NetworkInterface network in networkInterfaces) 
    { 
        // Read the IP configuration for each network 
        IPInterfaceProperties properties = network.GetIPProperties(); 

        // Each network interface may have multiple IP addresses 
        foreach (IPAddressInformation address in properties.UnicastAddresses) 
        { 
            // We're only interested in IPv4 addresses for now 
            if (address.Address.AddressFamily != AddressFamily.InterNetwork) 
                continue; 

            // Ignore loopback addresses (e.g., 127.0.0.1) 
            if (IPAddress.IsLoopback(address.Address)) 
                continue; 

            sb.AppendLine(address.Address.ToString() + " (" + network.Name + ")"); 
        } 
    } 

    MessageBox.Show(sb.ToString()); 
}

В частности, я не рекомендую Dns.GetHostAddresses(Dns.GetHostName());, независимо от того, насколько популярна эта строка в разных статьях и блогах.

Ответ 3

Здесь используется функция:

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

Ответ 4

Очень чистый и сладкий при использовании Linq

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

Ответ 5

Из MSDN в Dns.GetHostAddresses,

Когда пустая строка передается как имя узла, этот метод возвращает адреса IPv4 локального хоста для всех операционных систем, кроме Windows Server 2003; для Windows Server 2003, как IPv4, так и IPv6 адреса для локального хоста.

Адреса IPv6 фильтруются из результатов GetHostAddresses если на локальном компьютере не установлен IPv6. Как результат, можно вернуть пустой экземпляр IPAddress, если только Результаты IPv6, доступные для параметра hostNameOrAddress.parameter.

Итак, вы можете использовать это для попробовать и проанализировать его:

IPAddress.TryParse

затем проверьте AddressFamily, который

Возвращает System.Net.Sockets.AddressFamily.InterNetwork для IPv4 или System.Net.Sockets.AddressFamily.InterNetworkV6 для IPv6.

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

Ответ 6

Напишите locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)

Ответ 7

Я использовал ответ, который начинался с

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

Поскольку существовали сети, которые не работали и никогда не были там, я видел, что они были в реестре. --- Элвин

Ответ 8

Для меня более чистым решением будет:

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

Ответ 9

Я использую этот вспомогательный метод, который возвращает первый активный IPv4-адрес после фильтрации IPV6 и Loopback один раз


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

Ответ 10

Это мой код. И можете найти его на многих картах 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;
}