2015-09-19 20 views
23

我正在尝试在windows物联网中查找单播,DNS和网关地址。 通常我可以用NetworkInterface.GetAllNetworkInterfaces()方法访问这些值。如何获得UWP中的单播,DNS和网关地址?

但是在UWP中,缺少该方法。

获取这些值有没有其他选择?

+1

我会尝试' 'Iphlpapi.dll'的PInvoke' api方法。有几种有前景的方法可能包含你要找的东西,比如:GetInterfaceInfo(),GetAdaptersInfo(),GetAdaptersAddresses()等,这取决于你需要的确切信息。看[这里](http://www.pinvoke.net/default.aspx/iphlpapi/GetInterfaceInfo.html)。 – jsanalytics

+0

我刚刚尝试了标准UWP应用程序中的链接代码,并且没有任何问题。 – jsanalytics

+0

此外,你可能想研究[这里](https://msdn.microsoft.com/en-us/library/windows/desktop/aa366071%28v=vs.85%29.aspx)你将需要什么功能。 – jsanalytics

回答

3

你可以从Iphlpapi.dll尝试PInvoke方法。有可能包含单播,DNS和网关几种方法你要找的,像GetInterfaceInfo()GetAdaptersInfo()GetAdaptersAdresses()等,请查看这里可用方法的完整列表信息:IP Helper Functions - MSDN。最终不止一种方法可能是必要的。

至于如何做到这一点的例子,这里是从​​在我的本地计算机检索接口名称一些示例代码,作为标准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

+0

但单播,Dns和网关地址在哪里? –

1

试试这个代码片段,我发现在这里: 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; 
    } 
+0

谢谢,但只给出了IP地址。 – kaya