ottenere IPv4 locale del computer utilizzando VB.net
Domanda
Sto cercando di ottenere l'indirizzo IP del mio PC locale, e uno dei miei altri PC ottiene l'indirizzo v4 bene, ma su questo il codice:
Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString()
restituisce quello che immagino sia un indirizzo IPv6:
fe80::9c09:e2e:4736:4c62%11
Come posso ottenere l'indirizzo IPv4?
Soluzione
Disclaimer - Non ho IPv6 installato e probabilmente c'è un modo molto migliore per farlo, ma cosa restituisce quanto segue:
Dns.GetHostEntry(Dns.GetHostName()).AddressList
.Where(a => !a.IsIPv6LinkLocal && !a.IsIPv6Multicast && !a.IsIPv6SiteLocal)
.First()
.ToString();
Modifica: non ho notato che lo stavi chiedendo in VB, quindi ho provato a tradurlo in:
Dim s As String = Dns.GetHostEntry(Dns.GetHostName()).AddressList _
.Where(Function(a As IPAddress) Not a.IsIPv6LinkLocal AndAlso Not a.IsIPv6Multicast AndAlso Not a.IsIPv6SiteLocal) _
.First() _
.ToString()
Potrebbe esplodere, quindi non trattarlo come codice di produzione.
Altri suggerimenti
Ecco la mia soluzione per ottenere un IP IPv4 instradabile senza utilizzare un servizio esterno:
Function GetLocalIP() As String
Dim IPList As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName)
For Each IPaddress In IPList.AddressList
'Only return IPv4 routable IPs
If (IPaddress.AddressFamily = Sockets.AddressFamily.InterNetwork) AndAlso (Not IsPrivateIP(IPaddress.ToString)) Then
Return IPaddress.ToString
End If
Next
Return ""
End Function
Function IsPrivateIP(ByVal CheckIP As String) As Boolean
Dim Quad1, Quad2 As Integer
Quad1 = CInt(CheckIP.Substring(0, CheckIP.IndexOf(".")))
Quad2 = CInt(CheckIP.Substring(CheckIP.IndexOf(".") + 1).Substring(0, CheckIP.IndexOf(".")))
Select Case Quad1
Case 10
Return True
Case 172
If Quad2 >= 16 And Quad2 <= 31 Then Return True
Case 192
If Quad2 = 168 Then Return True
End Select
Return False
End Function
Nota che il mio codice sta anche verificando che l'intervallo sia instradabile (IsPrivateIP). Puoi rimuovere o modificare quella parte se stai cercando qualcos'altro.
Penso che dovresti usare questo:
Dim tmpHostName As String = System.Net.Dns.GetHostName()
myIPaddress = System.Net.Dns.GetHostByName(tmpHostName).AddressList(0).ToString()
GetHostByName
è obsoleto, ma questo è il modo per ottenere IPv4. Perché? Poiché la funzione getbyhostname
viene creata prima di IPv6, quindi la funzione ottiene solo la connessione IPv4, non fe80 :: 9c09: e2e: 4736: 4c62% 11
.
Qualcosa di forse divertente è questa piccola funzione che mostrerà tutti gli indirizzi IP sul tuo computer:
Public Function getOwnIp() As String
Dim hostIP As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
Dim position As Integer = 0
Dim ip As String = Nothing
While ipList < hostIP.AddressList.Length
ip += hostIP.AddressList(position).ToString & vbCrLf
position += 1
End While`enter code here`
Return ip
End Function
Stavo cercando la risposta a questa domanda e non riuscivo a trovarne una adatta alle mie esigenze. Sono riuscito a sperimentare varie risposte attraverso la rete fino a quando non ho trovato questo (funziona benissimo!). Ho pensato di condividere perché questo post è il miglior risultato tramite Google.
''''Routine to fetch IPv4 Network addresses for all local network interfaces.
Dim adapters As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
Dim adapter As NetworkInterface
For Each adapter In adapters
Dim properties As IPInterfaceProperties = adapter.GetIPProperties()
If properties.UnicastAddresses.Count > 0 Then
For Each unicastadress As UnicastIPAddressInformation In properties.UnicastAddresses
Dim ip As IPAddress = unicastadress.Address
If ip.AddressFamily = AddressFamily.InterNetwork Then
ComboBox1.Items.Add(ip.ToString)
End If
Next unicastadress
End If
Next adapter
Devi prima importare lo spazio dei nomi di sistema nella tua applicazione e quindi creare un'istanza di System.Net.NetworkInformation.IPAddressInformation
e usalo come tale
Esempio
Imports system.data.sqlclient
imports system
Public class Form1
Dim IPAdd As System.Net.NetworkInformation.IPAddressInformation
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox("My IP Address is " & IPAdd.Address.ToString)
End Sub
End Class
Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
txtLocal.Text = localIp.AddressList(1).ToString
Nota che ho cambiato l'indice (0)
in (1)
.