2015-11-18 13 views
6

Attualmente sto provando a trasferire un'applicazione console di amministrazione su un'app UWP Win 10. Ho problemi con l'utilizzo di System.Net.Dns dal seguente codice console.Come trovare l'indirizzo IP locale su un progetto UWP Win 10

Come posso ottenere i dispositivi IP

Ecco il codice console app che sto cercando di porto sopra.

public static string GetIP4Address() 
{ 
    string IP4Address = String.Empty; 
    foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) 
    { 
     if (IPA.AddressFamily == AddressFamily.InterNetwork) 
     { 
      IP4Address = IPA.ToString(); 
      break; 
     } 
    } 
    return IP4Address; 
} 

risposta

10

Si può provare in questo modo:

private string GetLocalIp() 
{ 
    var icp = NetworkInformation.GetInternetConnectionProfile(); 

    if (icp?.NetworkAdapter == null) return null; 
    var hostname = 
     NetworkInformation.GetHostNames() 
      .SingleOrDefault(
       hn => 
        hn.IPInformation?.NetworkAdapter != null && hn.IPInformation.NetworkAdapter.NetworkAdapterId 
        == icp.NetworkAdapter.NetworkAdapterId); 

    // the ip address 
    return hostname?.CanonicalName; 
} 

anche la risposta sopra è giusta

.210
+0

Ho difficoltà a decidere quale di questi utilizzare, quindi tornerò al segno di spunta dopo un po 'di sperimentazione. –

+0

Sembra che funzionino entrambi, ma ho contrassegnato il secondo perché era in un metodo che restituiva una stringa proprio come il mio esempio originale. È anche un po 'più come "il mio stile" di preferenze di codifica. Grazie ragazzi, voi ragazzi avete salvato la giornata. –

+0

Questo codice restituisce, in effetti e sicuramente, l'indirizzo IP locale, l''altro codice' restituisce l'indirizzo IP che il dispositivo o la rete locale utilizza per uscire su internet. – JuanK

12

Usare questo per ottenere ospite IPaddress in un'applicazione UWP, ho provato:

foreach (HostName localHostName in NetworkInformation.GetHostNames()) 
    { 
     if (localHostName.IPInformation != null) 
     { 
      if (localHostName.Type == HostNameType.Ipv4) 
      { 
       textblock.Text = localHostName.ToString(); 
       break; 
      } 
     } 
    } 

e vedere il doc API here

+0

questo non funzionerà se si dice VirtualBox, nel mio caso l'espressione NetworkInformation.GetHostNames(). FirstOrDefault (name => name.Type == HostNameType.Ipv4) ?. Nome da visualizzare ?? "???"; stava restituendo l'add-on IP della configurazione dello switch virtuale da parte di VirtualBox –

2

in base alla risposta da @ John Zhang, ma con difficoltà di non gettare errore LINQ su più partite e tornare indirizzo IPv4:

public static string GetLocalIp(HostNameType hostNameType = HostNameType.Ipv4) 
    { 
     var icp = NetworkInformation.GetInternetConnectionProfile(); 

     if (icp?.NetworkAdapter == null) return null; 
     var hostname = 
      NetworkInformation.GetHostNames() 
       .FirstOrDefault(
        hn => 
         hn.Type == hostNameType && 
         hn.IPInformation?.NetworkAdapter != null && 
         hn.IPInformation.NetworkAdapter.NetworkAdapterId == icp.NetworkAdapter.NetworkAdapterId); 

     // the ip address 
     return hostname?.CanonicalName; 
    } 

, ovviamente, si può passare HostNameType.Ipv6 invece di IPv4, che è l'impostazione predefinita (implicito) valore del parametro per ottenere l'indirizzo Ipv6

+0

nota che dopo aver aggiunto il controllo HostNameType nella query LINQ ha smesso di lanciare un'eccezione su più corrispondenze, ma per sicurezza ho modificato SingleOrDefault su FirstOrDefault –

+0

mi chiedo perché qualcuno abbia downvoted questa risposta che è quella che corregge gli altri (che restituisce indirizzi IP errati) –

+0

Questa è la migliore risposta. Non sono sicuro del motivo per cui questo è stato down-votato perché la tua risposta è il miglior codice da utilizzare per la maggior parte degli scenari. Inoltre, FirstOrDefault è il miglior metodo LINQ da utilizzare anche qui poiché possono essere presenti più indirizzi IP IPV4 o IPV6 su una macchina. Chiama la funzione GetFirstLocalIP() e tutto va bene. –

Problemi correlati