考虑以下设置: 具有LAN接口和WiFi接口的Windows PC(任何新笔记本电脑的标准)。每个接口可能与网络连接或断开。我需要一种方法来确定哪个适配器是连接到互联网的适配器 - 特别是,如果它们都连接到不同的网络,一个连接到互联网,一个没有。
我目前的解决方案是使用IPHelper的“GetBestInterface”功能并为其提供IP地址“0.0.0.0”。
您对这个问题有什么其他解决方案吗?
根据一些答案,让我详细说明:
@Chris Upchurch:这让我依赖google.com(通常不是问题)以及可能安装的任何个人防火墙以允许ping。
@Till:就像Steve Moon说的那样,依赖适配器的地址有点冒险,因为你对内部网络设置做了很多假设。
@Steve Moon:看一下路由表听起来是个好主意,但我不是自己应用路由逻辑,而是尝试使用上面描述的“GetBestInterface”。我相信它应该做的正是你在答案中概述的内容,但我并不确定。我不愿意实现自己的“路由逻辑”的原因是,如果我使用由更多“硬核”网络人员编写和测试的库/ API,那么我错误的机会就会出错。
答案 0 :(得分:4)
从技术上讲,没有“连接到互联网”。真正的问题是,哪个接口可以路由到所需的地址。现在,您正在查询“默认路由” - 如果没有到目的地的特定路由,则应用该路由。但是,你忽略了任何特定的路线。
幸运的是,对于99.9%的家庭用户来说,这就是诀窍。他们不太可能有很多路由表,GetBestInterface会自动更喜欢有线无线 - 所以你应该很好。为你搞砸了的.1%的案例投入覆盖选项,并将其称为一天。
但是,对于企业用途,您应该将GetBestInterface用于特定目的地 - 否则,如果有人与您的目的地在同一个LAN上,则会出现问题(这意味着您应该使用“内部”界面,而不是“外部”)或具有到目的地的特定路线(例如,我的内部网络可能与您的目的地网络对等)。
然后,我不确定你打算用这个“连接到互联网”的适配器做什么,所以这可能不是什么大问题。
答案 1 :(得分:1)
显然,在Vista中有新的界面可以查询互联网连接等等。请查看NLM Interfaces,特别是INetworkConnection - 您可以使用GetConnectivity方法专门查询网络连接是否具有互联网连接。
另见:Network Awareness on Windows Vista 不幸的是,这只适用于Vista,因此对于XP,我必须保留原始启发式。
答案 2 :(得分:1)
我会查看路由表。无论哪个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持有;如果我没记错的话,以前是斯普林特。
答案 3 :(得分:0)
通过每个网卡ping google.com。
答案 4 :(得分:0)
开始>运行> cmd.exe(适用于XP和Vista):ipconfig /all
显示有关计算机中接口的所有信息。面向“公共”的接口应具有公共IP地址。对于初学者来说,它不应该是192.168.x.x或10.x.x.x:)
答案 5 :(得分:0)
查看路由表?通常,除非您在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地址,或localhost范围(127.0.0.0/8),或多播,任何其他保留范围,以及解析为.mil或.gov的任何地址(虽然它没有听起来像getbestinterface发送任何流量,通过让联邦调查局打破你的门,它会很难找到...:)
答案 6 :(得分:0)
运行traceroute到一些公共站点会告诉你。当然,可能有多个界面可以帮助您。
答案 7 :(得分:0)
从网络的角度来看,要么可以随时路由到“互联网”。如果在交换机上启用了生成树协议之类的东西,那么您可能会发现可能已经开始的路由卡可能不再存在。