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

我当前的解决方案涉及使用 IPHeper 的“获取最佳界面”函数并为其提供 IP 地址“0.0.0.0”。

对于这个问题,您还有其他建议的解决方案吗?

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

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

@克里斯·厄普彻奇:这使我依赖于 google.com 的启动(通常不是问题)以及任何可能安装的允许 ping 的个人防火墙。

@直到:正如 Steve Moon 所说,依赖适配器的地址是有风险的,因为您对内部网络设置做了很多假设。

@史蒂夫·穆恩:查看路由表听起来是个好主意,但我不是自己应用路由逻辑,而是尝试使用如上所述的“GetBestInterface”。我相信它应该做的正是您在答案中概述的内容,但我不太确定。我不愿意实现自己的“路由逻辑”的原因是,与使用由更多“硬核”网络人员编写和测试的库/API相比,我出错的可能性更大。

有帮助吗?

解决方案

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

幸运的是,对于 99.9% 的家庭用户来说,这就能解决问题。他们不太可能有太多的路由表,并且 GetBestInterface 会自动优先选择有线而不是无线 - 所以你应该很好。为你搞砸的 0.1% 的情况添加一个覆盖选项,然后就到此为止了。

但是,对于企业用途,您应该对特定目标使用 GetBestInterface - 否则,如果有人与您的目标位于同一 LAN 上,您将会遇到问题(这意味着您应该采用“内部”接口,而不是“外部”接口) )或有到您目的地的特定路由(例如,我的内部网络可以与您目的地的网络对等)。

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

其他提示

显然,Vista 中提供了新的界面,可以查询互联网连接等。看看 自然语言管理接口 特别是在 网络连接 - 您可以使用 GetConnectivity 方法专门查询网络连接是否具有 Internet 连接。

也可以看看: Windows Vista 上的网络感知不幸的是,这仅适用于 Vista,因此对于 XP,我必须保留我最初的启发式。

我会查看路由表。无论哪一个 NIC 具有 0.0.0.0 路由且已启用且具有最低度量,该 NIC 就是当前正在向 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 持有;如果我没记错的话,以前是 Sprint 的。

通过每个 NIC 对 google.com 执行 Ping 操作。

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

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

运行traceroute到一些公共站点将会告诉你。当然,可能有不止一个界面可以帮助您实现这一目标。

看看路由表?一般来说,除非您在 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 地址之一、本地主机范围 (127.0.0.0/8)、多播、任何其他保留范围以及解析为 .mil 或 .gov 的任何地址(虽然它不听起来 getbestinterface 并没有发送任何流量,通过让联邦调查局破门而入来找出答案会很糟糕......:)

从网络的角度来看,两者都可以随时路由到“互联网”。如果在交换机上启用了生成树协议之类的功能,那么您可能会发现最初的路由卡可能不再是了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top