你如何找出连接到互联网的NIC?

5
考虑下面的设置: 一台带有LAN接口和WiFi接口的Windows PC(任何新型笔记本电脑的标准配置)。每个接口可能连接或断开网络。我需要一种确定哪个适配器连接到互联网的方法——特别是在它们都连接到不同的网络时,一个连接到互联网,另一个没有。
我的当前解决方案涉及使用IPHelper的“GetBestInterface”函数,并向其提供IP地址“0.0.0.0”。
您是否有其他解决此问题的建议?
根据一些答案,让我详细说明:
- 我需要这样做是因为我有一个产品,必须选择要绑定的适配器。我无法控制网络或运行产品的主机的设置,因此我需要尽可能强大且尽可能少假设的解决方案。 - 我需要在代码中执行此操作,因为这是产品的一部分。
@Chris Upchurch: 这使我依赖于Google.com处于活动状态(通常不是问题),并且依赖于可能安装的任何个人防火墙允许ping。

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

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

8个回答

4
从技术上讲,不存在“连接到互联网”的情况。真正的问题是,哪个接口可以路由到所需的地址。现在,你正在查询“默认路由”——如果没有到目的地的特定路由,则应用此路由。但你忽略了任何特定路由。
幸运的是,对于99.9%的家庭用户来说,这样做就足够了。他们不太可能有一个庞大的路由表,GetBestInterface将自动优先有线而不是无线——所以你应该没问题。为犯错误的0.1%提供覆盖选项,然后结束工作。
但是,对于企业使用,你应该使用GetBestInterface来获取到特定目的地的接口——否则,如果有人与你的目标位于同一局域网中(这意味着你应该使用“内部”接口,而不是“外部”接口)或者已经有了到你目的地的特定路由(例如我的内部网络可能会连接到你目标的网络),那么你就会遇到问题。
另一方面,我不确定你打算如何使用这个“连接到互联网”的适配器,所以这可能并不是什么大问题。

1
我会看路由表。无论哪个NIC有一个0.0.0.0的路由并且已启用并且具有最低度量,就是当前发送数据包到互联网的nic。
所以在我的情况下,顶部的那个是“互联网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持有,如果我没记错的话。


1

显然,在Vista中有新的接口,可以查询互联网连接等信息。请查看NLM接口,并具体了解INetworkConnection - 您可以使用GetConnectivity方法特别查询网络连接是否具有互联网连接。

另请参阅:Windows Vista上的网络感知 不幸的是,这仅在Vista上可用,因此对于XP,我必须保留原始的启发式方法。


0

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

这将显示有关计算机接口的所有信息。"公共"面向接口应该具有公共IP地址。首先,它不应该是192.168.x.x或10.x.x.x :)


0
看路由表?通常情况下,除非你正在在 Windows 网络之间进行路由(这是可能的,但对于客户端计算机来说这在现今是不寻常的),持有默认路由的接口将具有互联网连接。
你的问题没有详细说明为什么或者你在做什么,因此我无法提供任何具体信息。命令行工具“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的任何地址(虽然它不会发送任何流量,但让联邦政府强行闯入门户也不太好... :)


0

运行 traceroute 到一些公共站点将会向你展示。当然,可能有多个接口可以让你到达那里。


0
从网络的角度来看,任何一方都可能随时路由到“互联网”。如果交换机启用了诸如生成树协议之类的功能,则您可能会发现最初作为路由卡的设备现在已经不再是了。

-1

通过每个网卡ping google.com。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接