我有这个查询IP地址的功能。
Dim strHostName As String
Dim strIPAddress As String
Public Function ipconfig()
strHostName = System.Net.Dns.GetHostName()
strIPAddress = System.Net.Dns.GetHostEntry(strHostName).AddressList(0).ToString()
rtb_Output.Text = rtb_Output.Text + "Computer Name: " & strHostName + Environment.NewLine + "IP Address: " &strIpAddress
End Function
它在我的Windows 7桌面有线连接上运行正常,并按预期返回IPv4地址。 当我在Windows 8平板电脑上运行它时,无论是有线还是无线,它都会返回IPv6地址,而我需要IPv4地址。您有什么想法,或者我如何让它返回IPv4地址?
答案 0 :(得分:2)
您的Windows 8计算机似乎不太可能,但肯定不是不可能,只有IPv6地址。但是,为任何操作系统关闭网络适配器上的IPv6支持并不罕见,因为它尚未得到普遍支持。检查每台计算机的适配器以验证地址并与结果进行比较。
无论如何,建议您假设您的查询将返回多个IPv6,IPv4等类型的地址以及任何类型的倍数。如果您要查找特定类型,请使用AddressFamily属性来标识类型。
例如,仅适用于IPv4:
Dim hostEntry = Dns.GetHostEntry(hostNameOrAddress)
Dim addressList As New List(Of IPAddress)
For Each address In hostEntry.AddressList
If address.AddressFamily = Sockets.AddressFamily.InterNetwork Then
addressList.Add(address)
End If
Next
Return addressList
答案 1 :(得分:0)
您可以使用:
System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName).AddressList.First.ToString()
答案 2 :(得分:0)
您可以使用LINQ过滤结果:
Dim ipHostEntry = Dns.GetHostEntry(Dns.GetHostName)
Dim ipAddress = ipHostEntry.AddressList.FirstOrDefault(Function(ip) ip.AddressFamily = AddressFamily.InterNetwork)
If ipAdress IsNot Nothing Then
' Output ipAdress.ToString()
Else
' No IPv4 address could be retrieved
End If
说明:
IPHostAddress.AddressList
返回Array(Of IPAddress)
,它实现了IEnumerable
接口,因此可以通过LINQ表达式进行枚举。
FirstOrDefault
将返回AddressList数组中与谓词lambda函数匹配的第一个元素,该函数作为第一个FirstOrDefault
的参数提交。必须编写谓词函数以返回布尔值。
数组从第一个元素迭代到最后一个元素,并且对于每个元素,评估lambda函数,其中参数ip
是当前迭代项。使用ip.AddressFamily = AddressFamily.InterNetwork
,我们确定当前项是否是IPv4地址。如果是,则表达式评估true
,并且FirstOrDefault
返回该项。如果它的计算结果为false
,则会检查数组中的下一个项目,依此类推。如果没有元素与谓词匹配,FirstOrDefault
将返回默认值,在本例中为Nothing
(注意:扩展名First
的工作方式相同,但如果没有项与谓词匹配则抛出异常;可以在没有任何参数的情况下调用First
和FirstOrDefault
,然后返回序列的第一个元素。
我更喜欢上面基于扩展方法的表示法,但如果您愿意,也可以使用原始的From In Where Select
LINQ表示法:
Dim ipAddress = (From ip In ipHostEntry.AddressList
Where ip.AddressFamily = AddressFamily.InterNetwork
Select ip)(0)
请注意,在这种情况下,(0)
是另一种扩展方法ElementAtOrDefault(index As Integer)
的参数。
答案 3 :(得分:0)
Public Function GetIPv4Address()
GetIPv4Address = String.Empty
Dim strmachine As String = System.Net.Dns.GetHostName()
Dim iphe As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(strmachine)
For Each ipheal As System.Net.IPAddress In iphe.AddressList
If ipheal.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork Then
GetIPv4Address = ipheal
' MsgBox(ipheal.ToString, MsgBoxStyle.Critical, "ERROR")
End If
Next
End Function