如何在 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.dll
的PInvoke
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不通外网问题