2015-09-19 6 views
23

Ich versuche Unicast, DNS und Gateway-Adresse in Windows IOT zu finden. Normalerweise kann ich auf diese Werte mit NetworkInterface.GetAllNetworkInterfaces() Methode zugreifen.Wie erhalten Unicast, DNS und Gateway-Adresse in UWP?

Aber in UWP fehlt diese Methode.

Gibt es eine Alternative, um diese Werte zu erhalten?

+1

Ich würde versuchen, zu ' PInvoke 'API-Methoden aus' Iphlpapi.dll'. Es gibt mehrere vielversprechende Methoden, die enthalten können, was Sie suchen, wie: 'GetInterfaceInfo()', 'GetAdaptersInfo()', 'GetAdaptersAddresses()', usw., abhängig von den genauen Informationen, die Sie benötigen. Schauen Sie [HIER] (http://www.pinvoke.net/default.aspx/iphlpapi/GetInterfaceInfo.html). – jsanalytics

+0

Ich habe gerade diesen Code aus dem Link in einer Standard-UWP-App ausprobiert und es funktioniert ohne Probleme. – jsanalytics

+0

Sie können auch [HIER] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366071%28v=vs.85%29.aspx) nachlesen, welche Funktionen Sie benötigen. – jsanalytics

Antwort

3

Sie zu PInvoke Methoden von Iphlpapi.dll versuchen könnte. Es gibt mehrere Methoden, die die Unicast, DNS- und Gateway- Info Sie suchen enthalten, wie GetInterfaceInfo(), GetAdaptersInfo(), GetAdaptersAdresses() etc. finden Sie eine vollständige Liste der verfügbaren Methoden hier: IP Helper Functions - MSDN. Schließlich könnte mehr als eine Methode notwendig sein.

Als ein Beispiel, wie man es tun, hier ist ein Beispielcode aus PInvoke.Net Schnittstellennamen in meinem lokalen Computer abrufen, als Standard UWP App implementiert:

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

Aber wo ist die Unicast, DNS und Gateway Adresse? –

1

diesen Code Snippet Versuchen ich hier gefunden: 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

Danke, aber das gibt nur IP Adresse. – kaya