使用VB.net获取计算机的本地IPv4
我正在尝试获取本地电脑的ip地址,而我的另一台电脑的v4地址很好,但在这台电脑上,代码是:使用VB.net获取计算机的本地IPv4,vb.net,ipv4,Vb.net,Ipv4,我正在尝试获取本地电脑的ip地址,而我的另一台电脑的v4地址很好,但在这台电脑上,代码是: Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString() 返回我猜测的IPv6地址: fe80::9c09:e2e:4736:4c62%11 如何获取IPv4地址?免责声明-我没有安装IPv6,可能有更好的方法来实现这一点,但以下返回的是什么: Dns.GetHostEntry(Dns.GetHostName()).AddressList
Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString()
返回我猜测的IPv6地址:
fe80::9c09:e2e:4736:4c62%11
如何获取IPv4地址?免责声明-我没有安装IPv6,可能有更好的方法来实现这一点,但以下返回的是什么:
Dns.GetHostEntry(Dns.GetHostName()).AddressList
.Where(a => !a.IsIPv6LinkLocal && !a.IsIPv6Multicast && !a.IsIPv6SiteLocal)
.First()
.ToString();
编辑-没有注意到您在VB中询问,因此我尝试将其翻译为:
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()
这可能会爆炸,因此不要将其视为生产代码。以下是我的解决方案,用于在不使用外部服务的情况下获得可路由的IPv4 IP:
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
函数GetLocalIP()作为字符串
Dim IPList As System.Net.IPHostEntry=System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName)
对于IPList.AddressList中的每个IP地址
'仅返回IPv4可路由IP
如果(IPaddress.AddressFamily=Sockets.AddressFamily.InterNetwork)和(不是IsPrivateIP(IPaddress.ToString)),则
返回IPaddress.ToString
如果结束
下一个
返回“”
端函数
函数IsPrivateIP(ByVal CheckIP作为字符串)作为布尔值
Dim Quad1,Quad2为整数
Quad1=CInt(CheckIP.Substring(0,CheckIP.IndexOf(“.”))
Quad2=CInt(CheckIP.Substring(CheckIP.IndexOf(“.”+1).子字符串(0,CheckIP.IndexOf(“.”))
选择案例1
案例10
返回真值
案例172
如果Quad2>=16和Quad2我认为您应该使用:
Dim tmpHostName As String = System.Net.Dns.GetHostName()
myIPaddress = System.Net.Dns.GetHostByName(tmpHostName).AddressList(0).ToString()
GetHostByName
已过时,但这是获取IPv4的方法。为什么?因为getbyhostname
函数是在IPv6之前创建的,所以该函数只获得IPv4连接,而不是fe80::9c09:e2e:4736:4c62%11
这个小函数可能很有趣,它将显示计算机上的所有IP地址:
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
公共函数getOwnIp()作为字符串
Dim hostIP作为IPHostEntry=Dns.GetHostEntry(Dns.GetHostName())
Dim位置为整数=0
Dim ip作为字符串=无
而ipList
我自己也在寻找这个问题的答案,但找不到适合我需要的答案。我在网上尝试了各种各样的答案,直到我想出了这个(效果很好!)。我只是想和大家分享一下,因为这篇文章是通过谷歌获得的最好结果
''''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
首先需要将系统名称空间导入到应用程序中,然后创建
系统.Net.NetworkInformation.IPAddressInformation的实例,并将其作为实例使用
范例
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
请注意,我将(0)
索引更改为(1)
我使用了组合的Cmd/visualbasic代码,它可以工作:
Dim ResString As String = "result.txt"
If File.Exists("result.txt") Then
File.Delete("result.txt")
End If
Shell("cmd.exe /c cd " & Application.StartupPath & " && ipconfig >> " & ResString & "&& exit", AppWinStyle.NormalFocus)
Dim Ipv4 As String
Dim Ipv4Found As Boolean = False
Dim Ipv4Char As Integer = 43
Dim Ipv4Str As String
Threading.Thread.Sleep(1500)
'Wait some seconds to create "result.txt"
Dim Ipv4Reader As StreamReader
Ipv4Reader = File.OpenText("result.txt")
Do Until Ipv4Found = True
Ipv4Str = Ipv4Reader.ReadLine()
If Not Ipv4Str = Nothing Then
If Ipv4Str.Contains("IPv4") Then
Try
Ipv4 = Ipv4Str.Chars(Ipv4Char)
Do Until Ipv4Char = 60
Ipv4Char = Ipv4Char + 1
Ipv4 = Ipv4 & Ipv4Str.Chars(Ipv4Char)
'Read results step by step
Loop
Catch ex As Exception
End Try
MsgBox("Your IPv4 Address is " & Ipv4)
Ipv4Found = True
Ipv4Reader.Close()
End If
Else
End If
Loop
如果您的计算机语言是英语,您可能会在IPv4字符串中有一些不寻常的字符(我的电脑实际上是意大利语的)Jonathan-我没有看到VB标记,所以用C#发布了我的答案。我现在(希望)已将其翻译成VB.NET。@RichardOD这段代码有多稳定?顺便说一下,谢谢你指出这一点,先生。这是VB,使用Linq
Dim ResString As String = "result.txt"
If File.Exists("result.txt") Then
File.Delete("result.txt")
End If
Shell("cmd.exe /c cd " & Application.StartupPath & " && ipconfig >> " & ResString & "&& exit", AppWinStyle.NormalFocus)
Dim Ipv4 As String
Dim Ipv4Found As Boolean = False
Dim Ipv4Char As Integer = 43
Dim Ipv4Str As String
Threading.Thread.Sleep(1500)
'Wait some seconds to create "result.txt"
Dim Ipv4Reader As StreamReader
Ipv4Reader = File.OpenText("result.txt")
Do Until Ipv4Found = True
Ipv4Str = Ipv4Reader.ReadLine()
If Not Ipv4Str = Nothing Then
If Ipv4Str.Contains("IPv4") Then
Try
Ipv4 = Ipv4Str.Chars(Ipv4Char)
Do Until Ipv4Char = 60
Ipv4Char = Ipv4Char + 1
Ipv4 = Ipv4 & Ipv4Str.Chars(Ipv4Char)
'Read results step by step
Loop
Catch ex As Exception
End Try
MsgBox("Your IPv4 Address is " & Ipv4)
Ipv4Found = True
Ipv4Reader.Close()
End If
Else
End If
Loop