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

Локальный IP-адрес запроса

Мне нужно знать мой фактический локальный IP-адрес (т.е. не loopback-адрес) из приложения Windows 8 WinRT/Metro. Мне нужно несколько причин. Самое простое, что в пользовательском интерфейсе приложения я хотел бы показать некоторый текст, например: "IP-адрес вашей локальной сети: [IP queried from code]".

Мы также используем адрес для некоторых дополнительных сетевых комм. Эти коммиты совершенно верны, потому что все это работает, если я смотрю на IP-адрес в панели управления, а затем жестко программирую его в приложении. Попросив пользователя в диалоговом окне взглянуть на адрес и ввести его вручную, я действительно хочу этого избежать.

Я бы подумал, что не будет сложной задачей получить адрес программным путем, но мои поисковые системы и навыки StackOverflow опустятся.

В этот момент я начинаю рассматривать выполнение цикла UDP broadcast/listen, чтобы услышать мой собственный запрос и извлечь из него адрес, но это действительно похоже на hackey kludge. Есть ли API где-нибудь в новом материале WinRT, который доставит меня туда?

Обратите внимание, что я сказал "Приложение WinRT. Это означает, что типичные механизмы, такие как Dns.GetHostEntry или NetworkInterface.GetAllInterfaces(), не будут работать.

4b9b3361

Ответ 1

После многократного поиска я нашел нужную информацию, используя NetworkInformation и HostName.

NetworkInformation.GetInternetConnectionProfile извлекает профиль подключения, связанный с подключением к Интернету, которое в настоящее время используется локальной машиной.

NetworkInformation.GetHostNames извлекает список имен хостов. Это не очевидно, но это включает адреса IPv4 и IPv6 в виде строк.

Используя эту информацию, мы можем получить IP-адрес сетевого адаптера, подключенного к Интернету следующим образом:

public string CurrentIPAddress()
{
    var icp = NetworkInformation.GetInternetConnectionProfile();

    if (icp != null && icp.NetworkAdapter != null)
    {
        var hostname =
            NetworkInformation.GetHostNames()
                .SingleOrDefault(
                    hn =>
                    hn.IPInformation != null && hn.IPInformation.NetworkAdapter != null
                    && hn.IPInformation.NetworkAdapter.NetworkAdapterId
                    == icp.NetworkAdapter.NetworkAdapterId);

        if (hostname != null)
        {
            // the ip address
            return hostname.CanonicalName;
        }
    }

    return string.Empty;
}

Обратите внимание, что HostName имеет свойства CanonicalName, DisplayName и RawName, но все они возвращают одну и ту же строку.

Мы также можем получить адреса для нескольких адаптеров с кодом, подобным этому:

private IEnumerable<string> GetCurrentIpAddresses()
{
    var profiles = NetworkInformation.GetConnectionProfiles().ToList();

    // the Internet connection profile doesn't seem to be in the above list
    profiles.Add(NetworkInformation.GetInternetConnectionProfile());

    IEnumerable<HostName> hostnames =
        NetworkInformation.GetHostNames().Where(h => 
            h.IPInformation != null &&
            h.IPInformation.NetworkAdapter != null).ToList();

    return (from h in hostnames
            from p in profiles
            where h.IPInformation.NetworkAdapter.NetworkAdapterId ==
                  p.NetworkAdapter.NetworkAdapterId
            select string.Format("{0}, {1}", p.ProfileName, h.CanonicalName)).ToList();
}

Ответ 2

О принятом ответе вам просто нужно:

HostName localHostName = NetworkInformation.GetHostNames().FirstOrDefault(h =>
                    h.IPInformation != null &&
                    h.IPInformation.NetworkAdapter != null);

Вы можете получить локальный IP-адрес следующим образом:

string ipAddress = localHostName.RawName; //XXX.XXX.XXX.XXX

Используемые пространства имен:

using System.Linq;
using Windows.Networking;
using Windows.Networking.Connectivity;