我可以做得比NetworkInterface.GetIsNetworkAvailable()更好吗?

时间:2015-02-03 17:24:35

标签: c# .net proxy network-programming

我有一个需要从网站访问资源的.NET应用程序。访问这些资源可能需要用户更改其代理设置。

我想知道如何最好地从应用程序检测网络的存在(即潜在的互联网连接),这种方式对于决定是否为用户提供更改其代理设置的能力非常有用。如果没有可用的网络可以连接到互联网,那么更改代理设置将无济于事。

NetworkInterface.GetIsNetworkAvailable(),但这会返回true

  

如果标记了任何网络接口" up"并不是一个环回或   隧道接口。

我发现断开网络电缆和我的机器上的wifi(无法访问Google)后,此方法仍然返回true,并且仍有许多网络接口。

  • 其中一个Ppp类型对应VPN连接。
  • 另一个有一种以太网,但描述了#34; Hyper-V虚拟以太网适配器#4"。
  • 第三个有一种Loopback。

显然,我所进行的测试只是探索性的,不能作为提出某种过滤器的决定性手段。有一个建议的过滤器here,但在我的测试中,无论我是否有互联网连接,这总是返回false,除非我连接到VPN。

我无法尝试访问(例如)google.com,因为代理设置配置不正确也会导致失败。

我想要做的是否有可行的解决方案?我可以做得比GetNetworkIsAvailable()更好吗?

1 个答案:

答案 0 :(得分:0)

Simon Mourieranswer on another question中指出,在某些情况下,标准方法被虚拟卡欺骗了。

他提议使用For 1 month 14 days round up to 1.5 month Nearest month or half month Days 3 months 2 months 1 months 4 months 1 months 3 months 3 months 6 months 4.5 months 6 months ,并通过接口进行迭代以检查连接并忽略虚拟,隧道和环回接口。

我已经实施了他的解决方案,效果很好。在性能方面,您可以跳过他的首字母NetworkInterface.GetAllNetworkInterfaces(),因为其余代码将进行完全相同的检查。两种方法都占用大量CPU,因此无需同时运行两种方法。

我不会抄袭并记功,因此请看一下他的回答:https://stackoverflow.com/a/8345173/146921