Как получить IPv4 и IPv6-адрес локальной машины?

Я разрабатываю приложение для Windows, и мне нужно найти IPv4 и IPv6-адреса локальной машины. ОС может быть XP или Windows 7.

У меня есть решение для получения MAC-адреса, например,

string GetMACAddress()
{
    var macAddr =
        (
            from nic in NetworkInterface.GetAllNetworkInterfaces()
            where nic.OperationalStatus == OperationalStatus.Up
            select nic.GetPhysicalAddress().ToString()
        ).FirstOrDefault();

    return macAddr.ToString();
}

Это работает во всех ОС.

Как правильно получить адреса IPv4 и IPv6, которые работают в XP и WINDOWS 7?


person Matt    schedule 10.07.2012    source источник


Ответы (3)


Чтобы получить все адреса IP4 и IP6, вот мое предпочтительное решение. Обратите внимание, что он также фильтрует петлевые IP-адреса, такие как 127.0.0.1 или ::1.

public static IEnumerable<IPAddress> GetIpAddress()
        {
            var host = Dns.GetHostEntry(Dns.GetHostName());
            return (from ip in host.AddressList where !IPAddress.IsLoopback(ip) select ip).ToList();
        }
person Ravi Shankar    schedule 14.03.2013
comment
Примечание. Для этого необходимо использовать пространства имен System.Linq и System.Collections.Generic. - person starbeamrainbowlabs; 15.10.2016

Вот мой метод получения только всех адресов IPv4.

    /// <summary>
    /// Gets/Sets the IPAddress(s) of the computer which the client is running on.
    /// If this isn't set then all IPAddresses which could be enumerated will be sent as
    /// a comma separated list.  
    /// </summary>
    public string IPAddress
    {
        set
        {
            _IPAddress = value;
        }
        get
        {
            string retVal = _IPAddress;

            // If IPAddress isn't explicitly set then we enumerate all IP's on this machine.
            if (_IPAddress == null)
            {
                // TODO: Only return ipaddresses that are for Ethernet Adapters

                String strHostName = Dns.GetHostName();
                IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
                IPAddress[] addr = ipEntry.AddressList;

                List<string> validAddresses = new List<string>();

                // Loops through the addresses and creates a list of valid ones.
                for (int i = 0; i < addr.Length; i++)
                {
                    string currAddr = addr[i].ToString();
                    if( IsValidIP( currAddr ) ) {
                        validAddresses.Add( currAddr );
                    }
                }

                for(int i=0; i<validAddresses.Count; i++)
                {
                    retVal += validAddresses[i];
                    if (i < validAddresses.Count - 1)
                    {
                        retVal += ",";
                    }
                }

                if (String.IsNullOrEmpty(retVal))
                {
                    retVal = String.Empty;
                }

            }

            return retVal;
        }
    }
person blak3r    schedule 10.07.2012
comment
Ему нужны адреса IPv4 и IPv6. - person Security Hound; 10.07.2012
comment
@Ramhound ... да, и это ясно сказано. Может быть легко изменен для работы с IPv6. - person blak3r; 12.07.2012
comment
Вот почему я отклонил ваш ответ: Вот мой метод получения только всех адресов IPv4. вы не указываете, КАК изменить код для получения адреса IPv6. - person Security Hound; 12.07.2012

person    schedule
comment
Спасибо за ценную информацию. Но IPv6 возвращается ::1. Есть ли способ получить реальную стоимость? - person Matt; 10.07.2012
comment
@user970349 user970349, он должен вернуть что-то вроде fe80::9008:98d4:ffb8:25d8, вы это имеете в виду? - person Habib; 10.07.2012
comment
да. он должен вернуть что-то вроде fe80::9008:98d4:ffb8:25d8. все еще возвращается ::1 - person Matt; 10.07.2012
comment
большое спасибо. Теперь он отлично работает после правильной установки IPv6. - person Matt; 10.07.2012
comment
Не забывайте, что ::1 — это IPv6-эквивалент 127.0.0.1. Между addr[0] и addr[addr.Length-1] могут быть другие адреса, которые стоит проверить. - person Jesse Chisholm; 06.11.2012