在VB中返回IPv6而不是IPv4

时间:2013-10-31 18:18:39

标签: vb.net ipv6 ipv4

我有这个查询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地址?

4 个答案:

答案 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的工作方式相同,但如果没有项与谓词匹配则抛出异常;可以在没有任何参数的情况下调用FirstFirstOrDefault,然后返回序列的第一个元素。

我更喜欢上面基于扩展方法的表示法,但如果您愿意,也可以使用原始的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