2015-09-19 10 views
23

Sto cercando di trovare Unicast, Dns e Gateway Address in Windows IOT. Normalmente posso accedere a questi valori con il metodo NetworkInterface.GetAllNetworkInterfaces().Come ottenere Unicast, Dns e Gateway Address in UWP?

Ma in UWP manca questo metodo.

Esiste un'alternativa per ottenere questi valori?

+1

vorrei provare a ' Metodi di PInvoke' api da 'Iphlpapi.dll'. Ci sono diversi metodi promettenti che potrebbero contenere ciò che stai cercando, come: 'GetInterfaceInfo()', 'GetAdaptersInfo()', 'GetAdaptersAddresses()', ecc, a seconda delle informazioni esatte che ti servono. Guarda [QUI] (http://www.pinvoke.net/default.aspx/iphlpapi/GetInterfaceInfo.html). – jsanalytics

+0

Ho appena provato quel pezzetto di codice dal collegamento in un'app UWP standard e funziona senza problemi. – jsanalytics

+0

Inoltre, potresti voler ricercare [QUI] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366071%28v=vs.85%29.aspx) di quali funzioni avrai bisogno. – jsanalytics

risposta

3

Si potrebbe provare a PInvoke metodi da Iphlpapi.dll. Ci sono diversi metodi che possono contenere il Unicast, DNS e Gateway informazioni che stai cercando, come GetInterfaceInfo(), GetAdaptersInfo(), GetAdaptersAdresses(), ecc Si prega di visualizzare un elenco completo dei metodi disponibili qui: IP Helper Functions - MSDN. Alla fine potrebbe essere necessario più di un metodo.

Per fare un esempio su come farlo, ecco alcuni esempi di codice da PInvoke.Net recupero di nomi di interfaccia nel mio computer locale, implementato come un app UWP serie:

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

Ma dov'è l'indirizzo Unicast, Dns e Gateway? –

1

Prova questa frammento di codice che ho trovato qui: 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

Grazie, ma questo fornisce solo l'indirizzo IP. – kaya