如何在 UWP 中获取单播、Dns 和网关地址?

Posted

技术标签:

【中文标题】如何在 UWP 中获取单播、Dns 和网关地址?【英文标题】:How to get Unicast, Dns and Gateway Address in UWP? 【发布时间】:2015-12-16 19:31:00 【问题描述】:

我正在尝试在 Windows IOT 中查找单播、Dns 和网关地址。 通常我可以使用NetworkInterface.GetAllNetworkInterfaces() 方法访问这些值。

但在 UWP 中,缺少该方法。

有没有其他方法可以获取这些值?

【问题讨论】:

我会尝试来自Iphlpapi.dllPInvoke api 方法。有几种有前途的方法可能包含您正在寻找的内容,例如:GetInterfaceInfo()GetAdaptersInfo()GetAdaptersAddresses() 等,具体取决于您需要的确切信息。看HERE。 我刚刚尝试了标准 UWP 应用中链接中的那段代码,它没有问题。 另外,你可能想研究HERE你需要什么功能。 @jstreet 感谢您的帮助。效果很好。 @jstreet 你能把你的评论转换成答案吗?赏金。 【参考方案1】:

您可以尝试使用Iphlpapi.dll 中的PInvoke 方法。有几种方法可能包含您正在寻找的单播、Dns 和网关信息,例如GetInterfaceInfo()GetAdaptersInfo()GetAdaptersAdresses() 等。请在此处查看可用方法的完整列表:IP Helper Functions - 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;
    

【讨论】:

但是单播、Dns 和网关地址在哪里?【参考方案2】:

试试我在这里找到的这段代码片段: 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;
    

【讨论】:

谢谢,但这只是给出了 IP 地址。【参考方案3】:

正如 jstreet 所说,Invoke 是解决方案。我尝试使用 Lumia 950,GetAdaptersInfo() 工作,而不是 IcmpSendEcho()

通过以下链接,您应该这样做: http://www.pinvoke.net/default.aspx/iphlpapi/GetAdaptersInfo.html

【讨论】:

以上是关于如何在 UWP 中获取单播、Dns 和网关地址?的主要内容,如果未能解决你的问题,请参考以下文章

CentOS6.5设置静态IP、网关、配置DNS,解决ping不通外网问题

如何设置Linux获取动态及静态IP地址

请问移动光纤怎么连接路由器?无法获得公网IP地址、掩码和网关、DNS信息

在android中获取网关IP地址

delphi 获取IP,子网,网关,DNS

如何设置正确的IP地址和DNS?