我有一个.NET应用程序,需要从网站访问资源。访问这些资源可能需要用户更改其代理设置。
我想知道如何最好地从应用程序中检测网络的存在(即潜在的互联网连接),这对于确定是否向用户提供更改代理设置的功能很有用。如果没有可用的网络允许连接到Internet,则更改代理设置将无济于事。
有NetworkInterface.GetIsNetworkAvailable(),但是返回true
如果任何网络接口被标记为“打开”并且不是环回或
隧道接口。
我发现断开机器上的网络电缆和wifi的连接(无法访问Google)后,此方法仍然返回true,并且许多网络接口仍处于运行状态。
一个具有对应于VPN连接的Ppp类型。
另一个具有以太网类型,但有“ Hyper-V虚拟以太网适配器#4”的描述。
第三个具有环回类型。
显然,我执行的测试只是探索性的,不能用作提出某种过滤器的决定性手段。有一个建议的过滤器here,但是在我的测试中,除非我已连接到VPN,否则无论我是否有Internet连接,它始终返回false。
我不能仅尝试访问(例如)google.com,因为由于代理设置配置不正确,这也可能会失败。
我想做的事情有可行的解决方案吗?我可以比GetNetworkIsAvailable()做得更好吗?
最佳答案
正如Simon Mourier在answer on another question中指出的那样,在某些情况下标准方法被虚拟卡欺骗了。
他提议使用NetworkInterface.GetAllNetworkInterfaces()
并通过接口进行迭代以检查连接并忽略虚拟,隧道和环回接口。
我已经实施了他的解决方案,效果很好。在性能方面,您可以跳过他最初的NetworkInterface.GetIsNetworkAvailable()
,因为其余代码将进行完全相同的检查。两种方法在CPU上都相当昂贵,因此不必同时运行两种方法。
我不会效仿,所以请看一下他的答案:https://stackoverflow.com/a/8345173/146921
关于c# - 我可以做得比NetworkInterface.GetIsNetworkAvailable()好吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28305009/