我们如何找出哪个NIC连接到Internet?
请考虑以下设置:
带有LAN接口和WiFi接口(任何新笔记本电脑的标准)的Windows PC。每个接口都可能与网络连接或者断开连接。我需要一种方法来确定适配器中的哪一个是专门连接到Internet的适配器,以防它们都连接到不同的网络,其中一个可以连接到互联网,而另一个不连接。
我当前的解决方案涉及使用IPHelper的" GetBestInterface"功能并为其提供IP地址" 0.0.0.0"。
我们还有其他建议解决此问题的方法吗?
在回答一些问题之后,让我详细说明一下:
- 我需要这个,因为我有一个必须选择要绑定到哪个适配器的产品。我无法控制产品运行所在的网络或者主机的设置,因此我需要一个尽可能健壮的解决方案,并且假设尽可能少。
- 我需要在代码中执行此操作,因为这是产品的一部分。
@Chris Upchurch:这使我依赖google.com正常运行(通常不是问题)以及可能已安装以允许ping的任何个人防火墙。
@Till:就像Steve Moon所说的那样,依靠适配器的地址有点冒险,因为我们对内部网络设置进行了很多假设。
@Steve Moon:看路由表听起来是个好主意,但我没有亲自使用路由逻辑,而是尝试如上所述使用" GetBestInterface"。我相信它应该做的正是我们在回答中概述的内容,但是我不确定。我不愿意实现自己的"路由逻辑"的原因是,与使用由更多"硬核"网络人员编写和测试的库/ API相比,我更有可能出错。
解决方案
回答
通过每个NIC ping google.com。
回答
开始>运行> cmd.exe(在XP和Vista中运行):ipconfig / all
这将显示有关计算机中接口的所有信息。面向"公共"的接口应具有公共IP地址。对于初学者,它不应为192.168.x.x或者10.x.x.x :)
回答
看一下路由表?通常,除非我们要在Windows中的网络之间进行路由(这是可能的,但如今对于客户端计算机来说并不常见),但拥有默认路由的接口将具有Internet连接。
问题没有详细说明原因或者原因,因此我无法提供任何细节。命令行工具" route"可能会有所帮助,但是可能存在用于查看路由表的任何编程语言的库。
我们不能依赖接口的IP地址(例如,假设RFC-1918地址[192.168.0.0/16、172.16.0.0/12、10.0.0.0/8]不是Internet),因为大多数站点都有某种经过NAT转换的防火墙或者代理设置," Internet"接口实际上位于"专用"局域网上,可将我们带到Internet。
更新:根据进一步信息,听起来我们有一个不错的解决方案。我不太确定选择0.0.0.0,因为这是IP地址的边界情况-在特定的平台/语言组合上可能没问题。听起来(从API描述起)就像我们可以只指定一个地址一样,为什么不知道互联网上的某些地址,例如我们网站的IP地址,还是65.66.67.68等更随机的内容?只需确保不要选择rfc-1918地址之一,或者本地主机范围(127.0.0.0/8),或者多播,任何其他保留范围,以及任何解析为.mil或者.gov的地址(听起来好像getbestinterface没有发送任何流量,但要让联邦调查局把门弄坏,这真是令人费解……:)
回答
运行traceroute到某个公共站点将向我们显示。当然,可能会有不止一个界面可以带我们到那里。
回答
从技术上讲,没有"连接到Internet"。真正的问题是,哪个接口可路由到所需地址。现在,我们要查询的是"默认路由",如果没有到目的地的特定路由,该默认路由将适用。但是,我们将忽略任何特定的路线。
幸运的是,对于99.9%的家庭用户来说,就可以解决问题。他们不太可能有太多的路由表,并且GetBestInterface会自动更喜欢有线而不是无线,因此我们应该不错。对于我们搞砸的0.1%的情况,请使用替代选项,然后将其命名为" day"。
但是,对于公司用途,我们应该将GetBestInterface用于特定的目标,否则,如果某人与目标位于同一LAN上,则会遇到问题(这意味着我们应该使用"内部"接口,而不是"外部"接口)或者具有到目的地的特定路由(例如,我的内部网络可以与目的地的网络对等)。
再说一次,我不确定我们打算如何使用此适配器"连接到Internet"来做什么,所以可能没什么大不了的。
回答
显然,在Vista中,有新的界面可以查询Internet连接及其他内容。查看NLM接口,尤其是INetworkConnection,我们可以使用GetConnectivity方法专门查询网络连接是否具有Internet连接。
另请参阅:Windows Vista上的网络意识
不幸的是,这仅在Vista上可用,因此对于XP,我必须保持原始的启发式。
回答
我看一下路由表。当前正在将数据包发送到Internet的NIC是具有0.0.0.0路由且已启用且具有最低度量的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的。
回答
从网络的角度来看,任何一个都可以随时路由到"互联网"。如果在交换机上启用了诸如生成树协议之类的功能,那么我们可能会发现开始使用的路由卡可能不再存在。