2010-01-12 11 views
7

ho il seguente codice:.Net IPAddress IPv4

Dim ipAdd As IPAddress = Dns.GetHostEntry(strHostname).AddressList(0) 
Dim strIP As String = ipAdd.ToString() 

Quando converto in stringa invece di un indirizzo IPv4, come 192.168.1.0 o simili ottengo la versione IPv6: FD80 :: 5dbe: 5d89: e51b : indirizzo d313.

C'è un modo per restituire l'indirizzo IPv4 dal tipo IPAddress?

Grazie

risposta

15

Invece di incondizionatamente prendere il primo elemento del AddressList, si può prendere il primo indirizzo IPv4: soluzione

var address = Dns.GetHostEntry(strHostname) 
       .AddressList 
       .First(ip => ip.AddressFamily == AddressFamily.InterNetwork); 
+0

Ecco la versione VB di quello: Dim ipAdd As Indirizzo IP = Dns.GetHostEntry ("aol.com"). AddressList.First (Funzione (f) f.AddressFamily = Sockets.AddressFamily.InterNetwork) –

2

del DTB lavorerà in molte situazioni. In molti casi, tuttavia, gli utenti potrebbero avere più configurazioni di v4 IP sul proprio sistema. A volte ciò accade perché hanno alcuni adattatori "virtuali" (da applicazioni come VirtualBox o VMWare) o perché hanno più di una scheda di rete fisica connessa al loro computer.

Va da sé che in queste situazioni è importante utilizzare l'IP corretto. Si consiglia di considerare di chiedere all'utente quale IP è appropriato.

Per ottenere un elenco di IP v4 utilizzabili è possibile utilizzare codice simile a:

'ottenere un array che contiene tutti gli indirizzi IP disponibili: Dim elenco IPList() Come IPAddress = Net.Dns.GetHostEntry (Net. Dns.GetHostName.ToString) .AddressList

'Copy valid IPs from IPList to FinalIPList 
Dim FinalIPList As New ArrayList(IPList.Length) 
For Each IP As IPAddress In IPList 
    'We want to keep IPs only if they are IPv4 and not a 'LoopBack' device 
    '(an InterNetwork AddressFamily indicates a v4 IP) 
    If ((Not IPAddress.IsLoopback(IP)) And (IP.AddressFamily = AddressFamily.InterNetwork)) Then 
     FinalIPList.Add(IP) 
    End If 
Next IP 
0

per me la soluzione con il predicato "primo" non ha funzionato correttamente, questo è il codice che funziona per me:

public static string GetLocalIP() 
     { 
      string ipv4Address = String.Empty; 

      foreach (IPAddress currrentIPAddress in Dns.GetHostAddresses(Dns.GetHostName())) 
      { 
       if (currrentIPAddress.AddressFamily.ToString() == System.Net.Sockets.AddressFamily.InterNetwork.ToString()) 
       { 
        ipv4Address = currrentIPAddress.ToString(); 
        break; 
       } 
      } 

      return ipv4Address; 
     } 
Problemi correlati