Как получить адрес Unicast, Dns и шлюза в UWP?

Я пытаюсь найти адрес Unicast, Dns и шлюза в Windows IOT. Обычно я могу получить доступ к этим значениям с помощью метода NetworkInterface.GetAllNetworkInterfaces().

Но в UWP этот метод отсутствует.

Есть ли альтернатива для получения этих значений?


person kaya    schedule 19.09.2015    source источник
comment
Я бы попробовал PInvoke методы API из Iphlpapi.dll. Есть несколько многообещающих методов, которые могут содержать то, что вы ищете, например: GetInterfaceInfo(), GetAdaptersInfo(), GetAdaptersAddresses() и т. д., в зависимости от того, какая именно информация вам нужна. Посмотрите ЗДЕСЬ.   -  person jsanalytics    schedule 07.05.2016
comment
Я только что попробовал этот фрагмент кода по ссылке в стандартном приложении UWP, и он работает без проблем.   -  person jsanalytics    schedule 07.05.2016
comment
Кроме того, вы можете изучить ЗДЕСЬ какие функции вам понадобятся.   -  person jsanalytics    schedule 08.05.2016
comment
@jstreet спасибо за помощь. Это работает отлично.   -  person kaya    schedule 12.05.2016
comment
@jstreet, можешь ли ты преобразовать свой комментарий в ответ? за щедрость.   -  person kaya    schedule 13.05.2016


Ответы (3)


Вы можете попробовать PInvoke методы из Iphlpapi.dll. Существует несколько методов, которые могут содержать искомую информацию Unicast, DNS и шлюз, например GetInterfaceInfo(), GetAdaptersInfo(), GetAdaptersAdresses() и т. д. См. полный список доступных методы здесь: Вспомогательные функции IP - MSDN. В конечном итоге может потребоваться более одного метода.

В качестве примера того, как это сделать, вот пример кода из PInvoke.Net получение имен интерфейсов на моем локальном компьютере, реализованное как стандартное приложение UWP:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        List<string> list = new List<string>();

        IP_INTERFACE_INFO ips = Iphlpapi.GetInterfaceInfo();

        list.Add(string.Format("Adapter count = {0}", ips.NumAdapters));

        foreach (IP_ADAPTER_INDEX_MAP ip in ips.Adapter)
            list.Add(string.Format("Index = {0}, Name = {1}", ip.Index, ip.Name));

        listView1.ItemsSource = list;
    }
}

// PInvoke
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_ADAPTER_INDEX_MAP
{
    public int Index;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = PInvokes.MAX_ADAPTER_NAME)]
    public String Name;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_INTERFACE_INFO
{
    public int NumAdapters;
    public IP_ADAPTER_INDEX_MAP[] Adapter;

    public static IP_INTERFACE_INFO FromByteArray(Byte[] buffer)
    {
        unsafe
        {
            IP_INTERFACE_INFO rv = new IP_INTERFACE_INFO();
            int iNumAdapters = 0;
            Marshal.Copy(buffer, 0, new IntPtr(&iNumAdapters), 4);
            IP_ADAPTER_INDEX_MAP[] adapters = new IP_ADAPTER_INDEX_MAP[iNumAdapters];
            rv.NumAdapters = iNumAdapters;
            rv.Adapter = new IP_ADAPTER_INDEX_MAP[iNumAdapters];
            int offset = sizeof(int);
            for (int i = 0; i < iNumAdapters; i++)
            {
                IP_ADAPTER_INDEX_MAP map = new IP_ADAPTER_INDEX_MAP();
                IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(map));
                Marshal.StructureToPtr(map, ptr, false);
                Marshal.Copy(buffer, offset, ptr, Marshal.SizeOf(map));
                //map = (IP_ADAPTER_INDEX_MAP)Marshal.PtrToStructure(ptr, typeof(IP_ADAPTER_INDEX_MAP));
                map = Marshal.PtrToStructure<IP_ADAPTER_INDEX_MAP>(ptr);
                Marshal.FreeHGlobal(ptr);
                rv.Adapter[i] = map;
                offset += Marshal.SizeOf(map);
            }
            return rv;
        }
    }
}

internal class PInvokes
{
    public const int MAX_ADAPTER_NAME = 128;

    public const int ERROR_INSUFFICIENT_BUFFER = 122;
    public const int ERROR_SUCCESS = 0;

    [DllImport("Iphlpapi.dll", CharSet = CharSet.Unicode)]
    public static extern int GetInterfaceInfo(Byte[] PIfTableBuffer, ref int size);

    [DllImport("Iphlpapi.dll", CharSet = CharSet.Unicode)]
    public static extern int IpReleaseAddress(ref IP_ADAPTER_INDEX_MAP AdapterInfo);
}

public class Iphlpapi
{
    public static IP_INTERFACE_INFO GetInterfaceInfo()
    {
        int size = 0;
        int r = PInvokes.GetInterfaceInfo(null, ref size);
        Byte[] buffer = new Byte[size];
        r = PInvokes.GetInterfaceInfo(buffer, ref size);
        if (r != PInvokes.ERROR_SUCCESS)
            throw new Exception("GetInterfaceInfo returned an error.");
        IP_INTERFACE_INFO info = IP_INTERFACE_INFO.FromByteArray(buffer);
        return info;
    }
}

введите здесь описание изображения

person jsanalytics    schedule 12.05.2016
comment
Но где Unicast, Dns и адрес шлюза? - person Syaiful Nizam Yahya; 23.01.2017

Попробуйте этот фрагмент кода, который я нашел здесь: https://social.msdn.microsoft.com/Forums/en-US/27a8b7a8-8071-4bc1-bbd4-e7c1fc2bd8d7/windows-10-iot-core-how-do-you-create-a-tcp-server-and-client?forum=WindowsIoT

    public static string GetDirectConnectionName()
    {
        var icp = NetworkInformation.GetInternetConnectionProfile();
        if (icp != null)
        {
            if(icp.NetworkAdapter.IanaInterfaceType == EthernetIanaType)
            {
                return icp.ProfileName;
            }
        }

        return null;
    }

    public static string GetCurrentNetworkName()
    {
        var icp = NetworkInformation.GetInternetConnectionProfile();
        if (icp != null)
        {
            return icp.ProfileName;
        }

        var resourceLoader = ResourceLoader.GetForCurrentView();
        var msg = resourceLoader.GetString("NoInternetConnection");
        return msg;
    }

    public static string GetCurrentIpv4Address()
    {
        var icp = NetworkInformation.GetInternetConnectionProfile();
        if (icp != null && icp.NetworkAdapter != null && icp.NetworkAdapter.NetworkAdapterId != null)
        {
            var name = icp.ProfileName;

            var hostnames = NetworkInformation.GetHostNames();

            foreach (var hn in hostnames)
            {
                if (hn.IPInformation != null &&
                    hn.IPInformation.NetworkAdapter != null &&
                    hn.IPInformation.NetworkAdapter.NetworkAdapterId != null &&
                    hn.IPInformation.NetworkAdapter.NetworkAdapterId == icp.NetworkAdapter.NetworkAdapterId &&
                    hn.Type == HostNameType.Ipv4)
                {
                    return hn.CanonicalName;
                }
            }
        }

        var resourceLoader = ResourceLoader.GetForCurrentView();
        var msg = resourceLoader.GetString("NoInternetConnection");
        return msg;
    }
person 6StringBendr    schedule 23.01.2016
comment
Спасибо, но это дает только IP-адрес. - person kaya; 23.01.2016

Как прокомментировал jstreet, Invoke — это решение. Я пробовал с Lumia 950, и GetAdaptersInfo() работает, а не IcmpSendEcho().

Это нужно сделать по следующей ссылке: http://www.pinvoke.net/default.aspx/iphlpapi/GetAdaptersInfo.html

person dcaso    schedule 10.05.2016