【发布时间】:2016-02-17 12:07:07
【问题描述】:
问题“如何获取 IP 地址?”在 S.O. 中可能看起来很热门和 already answered,但我在下面解释的情况下遇到了麻烦。
我正在编写一个简单的帮助类来提供各种网络实用程序,这些实用程序将帮助我的开发。我想编写一个函数来返回当前机器的 Ipv4 或 Ipv6,与我通过网络浏览器导航时使用的 Ip 相同,你知道……只是用户的相关 Ip,我想无需查询 random site 即可发现所使用的 IP 地址。
对于大多数人来说,任务很简单:
(From ip As IPAddress In Dns.GetHostEntry(Dns.GetHostName).AddressList()
Where ip.AddressFamily = AddressFamily.InterNetwork).FirstOrDefault
或者通过迭代System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces 接口来做同样的事情,但是,我发现这种方法在大多数情况下效率不高......
在我的系统中,我有 4 个适配器,其中 4 个适配器是由 VMWare WorkStation 创建的虚拟适配器(作为以太网适配器受到威胁),一个来自 TAP-Win32 驱动程序的虚拟适配器,以及“真实”或物理以太网适配器我用来浏览互联网的。
那么,在 C# 或 VB.Net 中,我如何识别正确的适配器来检索用于连接到 Internet 的真实 IP?返回 this?等网站的同一 IP。
请注意,当我问“如何识别正确的适配器”时,我要问的是“如何识别系统将用于连接到 Internet?”,因为用户可能有许多物理以太网适配器,但只有一个是“首选”连接到 Internet,那么......如何做到这一点?.
【问题讨论】:
-
使用的 IP 地址很可能与互联网上看到的不同(因此链接到重复问题)。如果您需要识别适配器,那么它可能是分配了网关的适配器,但如前所述,IP 地址与互联网站点看到的不同。
-
@David Martin 感谢您的评论。从链接的“重复”问题的 17 个答案中,其中 15 个答案完全相同,包括对外部站点进行查询,除了 Toprak 的解决方案使用 NATUPNPLib lib 来执行此操作,但出于任何原因我没有我的 Windows 文件系统中的那个 dll,而 kayabaku 的解决方案不起作用,它抛出一个空引用异常,所以不幸的是我仍然停留在同一点。
-
在我的情况下,我通过 .Net 框架类库获得的 IP 地址与显示 whatismyip.org 和所有此类网站的 IP 地址相同,我不寻找完美的完美,只是我想介绍一个常见的场景,其中用户拥有虚拟适配器和/或多个物理适配器,以避免获得与其他适配器之一相关联的错误 Ip,而不是有效地获得与那些相同的 Ip “显示我的 ip”网络服务返回给我。
-
您可以使用这个stackoverflow.com/questions/23809385/… 来获取路由表并使用第一个结果(即0.0.0.0 的路由)