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

C# 获取用于连接到Internet的IP地址。放弃虚拟网络,c#,.net,vb.net,ip,C#,.net,Vb.net,Ip,“如何获取IP地址?”这一问题在S.O.中似乎是热门话题,但我在下面解释的电路中遇到了麻烦 我正在编写一个简单的助手类来提供各种各样的网络实用程序,它们将帮助我进行开发。我想写一个函数,返回当前机器的Ipv4或Ipv6,与我在web浏览器中导航时使用的Ip相同,你知道。。。只是用户的相关Ip,我不想通过查询来发现所使用的Ip地址 对于大多数人来说,任务很简单: (From ip As IPAddress In Dns.GetHostEntry(Dns.GetHostName).AddressLi

“如何获取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 WorkStation创建的虚拟适配器(威胁为以太网适配器),一个是来自TAP-Win32驱动程序的虚拟适配器,另一个是我用来在Internet上导航的“真实”或物理以太网适配器

所以,在C#或VB.Net中,我如何识别合适的适配器来检索用于连接到Internet的真实Ip?返回像这样的网站的相同Ip


请注意,当我问“如何识别合适的适配器”“我要问的是”如何识别系统将用于连接到Internet的首选适配器?”,因为用户可以有多个物理以太网适配器,但只有一个是连接到Internet的“首选适配器”,然后。。。如何做到这一点?

以下是在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    

下面是在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    

所使用的IP地址的可能重复很可能与internet上看到的不同(因此指向重复问题的链接)。如果您需要识别适配器,那么它很可能是分配了网关的适配器,但如上所述,IP地址将与internet站点看到的不一样。@David Martin感谢您的评论。从链接的“重复”问题的17个答案中,有15个答案与查询外部站点完全相同,除了Toprak的解决方案使用NATUPNPLib lib来完成,但由于任何原因,我的Windows文件系统中没有该dll,kayabaku的解决方案不起作用,它抛出了一个空引用异常,不幸的是,我仍然停留在同一点上。在我的例子中,我通过.Net framework类库获得的Ip地址与显示whatismyip.org和所有此类网站的Ip地址相同,我并不寻求完美,我只想介绍一个常见场景IO,其中用户具有虚拟适配器和/或多个物理适配器,以避免获取与其他适配器之一关联的错误Ip,而不是高效地获取与“show me my Ip”web服务返回的Ip相同的Ip。您可以使用该场景获取路由表并使用第一个结果(这是0.0.0.0的路由)所用IP地址的可能重复很可能与internet上看到的不同(因此指向重复问题的链接)。如果您需要识别适配器,那么很可能是分配了网关的适配器,但如上所述,IP地址不会与internet站点看到的相同。@David Martin感谢您的评论。从链接的“重复”的17个答案中问题是,其中15个完全相同,包括对外部站点进行查询,除了Toprak的解决方案使用Natupnlib lib进行查询,但由于任何原因,我的Windows文件系统中没有该dll,kayabaku的解决方案不起作用,它抛出了一个空引用异常,所以不幸的是我仍然停留在同一点上在我的情况下,我通过.Net framework类库获得的Ip地址与显示whatismyip.org和所有此类网站的Ip地址相同,我并不寻求完美的解决方案,我只想介绍一个常见场景,其中用户有虚拟适配器和/或多个物理适配器,以避免获得错误的Ip关联ted到其他适配器之一,而不是高效地获得与“show me my Ip”web服务返回的Ip相同的Ip。您可以使用它来获取路由表并使用第一个结果(即0.0.0.0的路由)