获取用于连接到Internet的IP地址.放弃虚拟网络

本文关键字:放弃 地址 虚拟 虚拟网 网络 IP 用于 连接 Internet 获取 | 更新日期: 2023-09-27 18:22:01

"如何获取IP地址?"这个问题可能看起来很热门,在S.O.中已经回答了,但我在下面解释的情况中遇到了麻烦。

我正在编写一个简单的助手类来提供各种各样的网络实用程序,这些实用程序将帮助我进行开发。我想写一个函数,返回当前机器的Ipv4或Ipv6,与我在web浏览器中导航时使用的Ip相同,你知道。。。只有用户的相关Ip,我希望在不查询随机站点的情况下执行此操作,以发现所使用的Ip地址。

对于大多数人来说,任务很简单:

(From ip As IPAddress In Dns.GetHostEntry(Dns.GetHostName).AddressList()
 Where ip.AddressFamily = AddressFamily.InterNetwork).FirstOrDefault

或者通过迭代System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces接口来做同样的事情,然而,我发现方法在大多数情况下都不是有效的。。。

在我的系统中,我有4个适配器,其中2个是VMWare工作站创建的虚拟适配器(被称为以太网适配器),一个来自TAP-Win32驱动程序的虚拟适配器,以及我用来在互联网上导航的"真实"或物理以太网适配器。

那么,在C#或VB.Net中,我如何确定合适的适配器来检索用于连接到Internet的真实Ip?返回this等网站的Ip相同?。

请注意,当我问"如何识别正确的适配器"时,我要问的是"怎样识别系统将用于连接到Internet的首选适配器?",因为用户可能有许多物理以太网适配器,但只有一个是连接到Internet"首选"适配器,那么。。。如何做到这一点?。

获取用于连接到Internet的IP地址.放弃虚拟网络

以下是vb.net中使用LINQ的解决方案:

Function GetIP() As String
    Return (
        From networkInterface In networkInterface.GetAllNetworkInterfaces()
        Where networkInterface.NetworkInterfaceType = NetworkInterfaceType.Ethernet
        From address In networkInterface.GetIPProperties().UnicastAddresses
        Where address.Address.AddressFamily = Net.Sockets.AddressFamily.InterNetwork
        Select ip = address.Address.ToString()
    ).FirstOrDefault()
End Function