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

Значение моего RequestMapping заканчивается на .html, который должен быть чем-то другим.

Я попытался изменить его на .json, и он сработал для меня.

29
задан Greg Bacon 5 March 2013 в 13:47
поделиться

11 ответов

добавьте что-то подобное в ваш код

  if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
  // IPv4 address
27
ответ дан Joost Evertse 5 March 2013 в 13:47
поделиться

Написать locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)

4
ответ дан SLaks 5 March 2013 в 13:47
поделиться

Из моего блога :

/// <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());, независимо от того, насколько популярна эта строка в различных статьях и блог.

36
ответ дан Stephen Cleary 5 March 2013 в 13:47
поделиться

Вот функция, которую я использую:

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());
}
11
ответ дан Joe 5 March 2013 в 13:47
поделиться

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

IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
7
ответ дан electricalbah 5 March 2013 в 13:47
поделиться

Вот код для поиска первого подключенного IPv4 с помощью цикла for:

        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;
            }                
        }
0
ответ дан Farid 5 March 2013 в 13:47
поделиться

Я использую этот вспомогательный метод, который возвращает первый активный адрес 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;
    }
0
ответ дан Bedasso 5 March 2013 в 13:47
поделиться

Из MSDN на Dns.GetHostAddresses ,

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

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

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

IPAddress.TryParse

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

возвращает систему .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;
    }
}
4
ответ дан 5 March 2013 в 13:47
поделиться

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

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

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

1
ответ дан Farhan S. 5 March 2013 в 13:47
поделиться

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

 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;
        }
0
ответ дан Farhan S. 5 March 2013 в 13:47
поделиться

Это мой код. И может найти его на многих сетевых картах.

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
ответ дан Kim Ki Won 5 March 2013 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: