您如何知道哪个NIC连接到互联网?

时间:2008-09-02 05:16:23

标签: windows networking iphelper

考虑以下设置: 具有LAN接口和WiFi接口的Windows PC(任何新笔记本电脑的标准)。每个接口可能与网络连接或断开。我需要一种方法来确定哪个适配器是连接到互联网的适配器 - 特别是,如果它们都连接到不同的网络,一个连接到互联网,一个没有。

我目前的解决方案是使用IPHelper的“GetBestInterface”功能并为其提供IP地址“0.0.0.0”。

您对这个问题有什么其他解决方案吗?

根据一些答案,让我详细说明:

  • 我需要这个,因为我有一个产品必须选择要绑定的适配器。我无法控制网络的设置或产品运行的主机,所以我需要一个尽可能强大的解决方案,尽可能少的假设。
  • 我需要在代码中执行此操作,因为这是产品的一部分。

@Chris Upchurch:这让我依赖google.com(通常不是问题)以及可能安装的任何个人防火墙以允许ping。

@Till:就像Steve Moon说的那样,依赖适配器的地址有点冒险,因为你对内部网络设置做了很多假设。

@Steve Moon:看一下路由表听起来是个好主意,但我不是自己应用路由逻辑,而是尝试使用上面描述的“GetBestInterface”。我相信它应该做的正是你在答案中概述的内容,但我并不确定。我不愿意实现自己的“路由逻辑”的原因是,如果我使用由更多“硬核”网络人员编写和测试的库/ API,那么我错误的机会就会出错。

8 个答案:

答案 0 :(得分:4)

从技术上讲,没有“连接到互联网”。真正的问题是,哪个接口可以路由到所需的地址。现在,您正在查询“默认路由” - 如果没有到目的地的特定路由,则应用该路由。但是,你忽略了任何特定的路线。

幸运的是,对于99.9%的家庭用户来说,这就是诀窍。他们不太可能有很多路由表,GetBestInterface会自动更喜欢有线无线 - 所以你应该很好。为你搞砸了的.1%的案例投入覆盖选项,并将其称为一天。

但是,对于企业用途,您应该将GetBestInterface用于特定目的地 - 否则,如果有人与您的目的地在同一个LAN上,则会出现问题(这意味着您应该使用“内部”界面,而不是“外部”)或具有到目的地的特定路线(例如,我的内部网络可能与您的目的地网络对等)。

然后,我不确定你打算用这个“连接到互联网”的适配器做什么,所以这可能不是什么大问题。

答案 1 :(得分:1)

显然,在Vista中有新的界面可以查询互联网连接等等。请查看NLM Interfaces,特别是INetworkConnection - 您可以使用GetConnectivity方法专门查询网络连接是否具有互联网连接。

另见:Network Awareness on Windows Vista 不幸的是,这只适用于Vista,因此对于XP,我必须保留原始启发式。

答案 2 :(得分:1)

我会查看路由表。无论哪个NIC具有0.0.0.0路由并且已启用且具有最低度量标准,则是当前正在将数据包发送到Internet的NIC。

所以在我的情况下,最重要的是'互联网网络'。

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0        10.0.0.10        10.0.0.51     20
          0.0.0.0          0.0.0.0        10.0.0.10        10.0.0.50     25
(much other stuff deleted)

另一种选择是ping或GetBestInterface 4.2.2.2 - 这是一个古老而值得尊敬的DNS服务器,目前由GTEI持有;如果我没记错的话,以前是斯普林特。

答案 3 :(得分:0)

通过每个网卡ping google.com。

答案 4 :(得分:0)

开始>运行> cmd.exe(适用于XP和Vista):ipconfig /all

显示有关计算机中接口的所有信息。面向“公共”的接口应具有公共IP地址。对于初学者来说,它不应该是192.168.x.x或10.x.x.x:)

答案 5 :(得分:0)

查看路由表?通常,除非您在Windows中的网络之间进行路由(这是可能的,但这些天对于客户端计算机来说是不常见的),保持默认路由的接口将具有Internet连接。

您的问题并未详细说明您为何或您正在执行此操作,因此我无法提供任何具体信息。命令行工具“route”可能有所帮助,但是可能存在用于查看路由表的任何编程语言的库。

您不能依赖接口的IP地址(例如,假设RFC-1918地址[192.168.0.0/16,172.16.0.0/12,10.0.0.0/8]不是互联网),因为大多数网站都有某种NAT防火墙或代理设置,“互联网”界面实际上是一个“私人”局域网,可以让你上网。

更新:根据您的进一步信息,听起来您有一个不错的解决方案。我不太确定0.0.0.0的选择,因为这是IP地址的边界情况 - 对于你特定的平台/语言组合可能没问题。声音(来自API描述)就像您可以指定地址一样,为什么不知道某些地址在互联网上,例如您的网站的IP地址,或更随机的东西,如65.66.67.68?只要确保不选择其中一个rfc-1918地址,或localhost范围(127.0.0.0/8),或多播,任何其他保留范围,以及解析为.mil或.gov的任何地址(虽然它没有听起来像getbestinterface发送任何流量,通过让联邦调查局打破你的门,它会很难找到...:)

答案 6 :(得分:0)

运行traceroute到一些公共站点会告诉你。当然,可能有多个界面可以帮助您。

答案 7 :(得分:0)

从网络的角度来看,要么可以随时路由到“互联网”。如果在交换机上启用了生成树协议之类的东西,那么您可能会发现可能已经开始的路由卡可能不再存在。