代码之家  ›  专栏  ›  技术社区  ›  Hershi

如何确定哪个NIC连接到internet?

  •  4
  • Hershi  · 技术社区  · 18 年前

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

    我目前的解决方案包括使用iPhoneper“ GetBestInterface 函数,并为其提供IP地址“0.0.0.0”。

    对于这个问题,你有没有其他的解决方案?

    以下是一些答案,让我详细说明:

    • 我需要在代码中这样做,因为这是产品的一部分。

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

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

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

    8 回复  |  直到 18 年前
        1
  •  4
  •   Mark Brackett    18 年前

    幸运的是,对于99.9%的家庭用户来说,这就足够了。他们不可能有太多的路由表,GetBestInterface会自动地选择有线而不是无线——所以你应该是个好人。在你搞砸的0.1%的情况下,加入一个覆盖选项,然后结束。

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

        2
  •  1
  •   Hershi    18 年前

    显然,在Vista中有一些新的接口,可以查询internet连接等。看一看 NLM Interfaces INetworkConnection

    Network Awareness on Windows Vista 不幸的是,这只在Vista上可用,所以对于XP,我必须保留我原来的启发式。

        3
  •  1
  •   quux    18 年前

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

        4
  •  0
  •   Chris Upchurch    18 年前

        5
  •  0
  •   Till    18 年前

    启动>运行>cmd.exe(在XP和Vista中工作): ipconfig /all

    这将显示有关计算机中接口的所有信息。面向“公共”的接口应具有公共IP地址。首先, 为192.168.x.x或10.x.x.x:)

        6
  •  0
  •   Mark Harrison    18 年前

        7
  •  0
  •   Steve Moon    18 年前

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

    你的问题没有详细说明你为什么这么做,或者你用什么做,所以我不能提供任何细节。命令行工具“route”可能会有所帮助,但可能有一些库,用于查看路由表时使用的任何编程语言。

    你不能依赖接口的IP地址(例如,假设RFC-1918地址[192.168.0.0/16,172.16.0.0/12,10.0.0.0/8]不是internet),因为大多数站点都有某种防火墙或代理设置,“internet”接口实际上是在“私有”lan上,可以让你上网。

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

        8
  •  0
  •   Tubs    18 年前

    推荐文章