gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:22:17 27 4
gpt4 key购买 nike

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

但在 UWP 中,该方法缺失。

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

最佳答案

您可以尝试 Iphlpapi.dll 中的 PInvoke 方法。有几种方法可能包含您要查找的Unicast、Dns 和 Gateway 信息,例如 GetInterfaceInfo()GetAdaptersInfo ()GetAdaptersAdresses() 等。请在此处查看可用方法的完整列表:IP Helper Functions - MSDN .最终可能需要不止一种方法。

作为如何操作的示例,这里有一些来自 PInvoke.Net 的示例代码在我的本地计算机中检索接口(interface)名称,作为标准 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;
}
}

enter image description here

关于c# - 如何在 UWP 中获取单播、Dns 和网关地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672520/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com