如何在UWP中获得单播,Dns和网关地址?

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

但在UWP中,缺少这种方法。

有没有替代方法来获得这些价值观?

您可以尝试从Iphlpapi.dll获取PInvoke方法。 有几种方法可能包含您正在寻找的单播,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 list = new List(); 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(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; } } 

在此处输入图像描述

试试我在这里找到的代码片段: https : //social.msdn.microsoft.com/Forums/en-US/27a8b7a8-8071-4bc1-bbd4-e7c1fc2bd8d7/windows-10-iot-core-how-do-you-创建-A-TCP服务器和客户端?论坛= 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; } 

正如jstreet评论的那样,Invoke就是解决方案。 我尝试使用Lumia 950, GetAdaptersInfo()工作,而不是IcmpSendEcho()

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