【问题标题】:How do you find out which NIC is connected to the internet?如何找出连接到 Internet 的 NIC?
【发布时间】:2008-09-02 05:16:23
【问题描述】:

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

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

对于这个问题,你有什么其他的建议可以解决吗?

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

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

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

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

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

【问题讨论】:

    标签: windows networking iphelper


    【解决方案1】:

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

    幸运的是,对于 99.9% 的家庭用户来说,这可以解决问题。他们不太可能有太多的路由表,GetBestInterface 会自动更喜欢有线而不是无线 - 所以你应该很好。为你搞砸的 0.1% 的案例添加一个覆盖选项,然后就结束了。

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

    再说一次,我不确定你打算用这个“连接到 Internet”的适配器做什么,所以这可能没什么大不了的。

    【讨论】:

      【解决方案2】:

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

      另见:Network Awareness on Windows Vista 不幸的是,这仅在 Vista 上可用,因此对于 XP,我必须保留我原来的启发式方法。

      【讨论】:

        【解决方案3】:

        我会查看路由表。无论哪个 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 持有;如果我没记错的话,以前是 Sprint。

        【讨论】:

          【解决方案4】:

          通过每个 NIC ping google.com。

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

              运行 traceroute 到某个公共站点会告诉你。当然,可能有不止一个界面可以让您到达那里。

              【讨论】:

                【解决方案7】:

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

                您的问题没有详细说明您这样做的原因或内容,因此我无法提供任何细节。命令行工具“route”可能会有所帮助,但无论您使用哪种编程语言,都可能有一些库来查看路由表。

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

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

                【讨论】:

                  【解决方案8】:

                  从网络的角度来看,任何时候都可以路由到“互联网”。如果在交换机上启用了诸如生成树协议之类的功能,那么您可能会发现原本可能是路由卡的东西可能不再存在了。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2012-09-30
                    • 1970-01-01
                    • 2016-07-06
                    • 2023-03-06
                    • 1970-01-01
                    • 2012-03-09
                    • 2019-09-03
                    • 1970-01-01
                    相关资源
                    最近更新 更多