【问题标题】:Why is GetIsNetworkAvailable() always returning true?为什么 GetIsNetworkAvailable() 总是返回 true?
【发布时间】:2012-11-19 15:54:35
【问题描述】:

我有这个方法:

public static void testConnection()
    {
        if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        {
            System.Windows.MessageBox.Show("This computer is connected to the internet");
        }
        else
        {
            System.Windows.MessageBox.Show("This computer is not connected to the internet");
        }
    }

我想它会告诉我连接是否可用,但即使我确定没有连接,它也总是返回 true(并打印第一条消息)。我做错了什么?

P.S.:我还在学习 C#。

【问题讨论】:

  • @TimSchmelter 我不明白,这是一个空白页。哦哦;)
  • NetworkInterface.GetIsNetworkAvailable() 不检查互联网连接。它只检查是否有任何网络连接可用。看到这个检查互联网连接。 stackoverflow.com/questions/5405895/…

标签: c# windows networking


【解决方案1】:

我觉得这个方法比较合适:

   public static bool getIsInternetAccessAvailable()
    {
        switch(NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel())
        {
            case NetworkConnectivityLevel.InternetAccess:
                return true;
            default:
                return false;
        }
    }

【讨论】:

  • 使用指令是什么?我找不到 GetInternetConnectionProfile 方法。
  • 您需要对此.GetInternetConnectionProfile() 进行空检查。拉动我的网络电缆以模拟中断导致它返回 null,而不是从 GetNetworkConnectivityLevel() 产生断开状态的对象。
  • 此技术似乎仅适用于通用 Windows 平台 (UWP) 项目。我尝试在我的桌面 WPF 项目中搜索命名空间,但无济于事。
【解决方案2】:

如果我错了,请纠正我,但据我所知,您使用的方法是检查 network 连接性,而不一定是 internet 连接性。我假设如果您在任何类型的网络上,无论互联网是否可用,这都会返回 true?见this

我注意到检查互联网连接的一种方法如下:

private bool IsInternetAvailable()
{
    try
    {
        Dns.GetHostEntry("www.google.com"); //using System.Net;
        return true;
    } catch (SocketException ex) {
        return false;
    }
}

上面的代码可以在下面的post找到(在VB.Net中通过阅读Joacim Andersson [MVP]的评论)。

注意:最新的编辑是由AceInfinity 建议的,但在社区审核中被拒绝。我的声誉太低,无法覆盖此设置,因此我自己进行了更改。

【讨论】:

  • 这在中国总是返回false。
  • 这很不幸。这是针对中国的所有拨出电话还是仅针对我认为已被阻止的谷歌之类的网站?
【解决方案3】:

来自msdn

在很多情况下,设备或计算机未连接到 一个有用的网络,但仍然被认为是可用的,并且 GetIsNetworkAvailable 将返回 true。

这些例子之一可能就是你的情况:

例如,如果设备 运行应用程序连接到无线网络 需要代理,但是没有设置代理,GetIsNetworkAvailable 会 返回真。 GetIsNetworkAvailable 何时返回的另一个示例 如果应用程序正在连接的计算机上运行,​​则为 true 到集线器或路由器已丢失上游的集线器或路由器 连接。

【讨论】:

  • 补充一点,GetIsNetworkAvailable() 的注释说“如果任何网络接口被标记为“up”并且不是环回或隧道接口,则认为网络连接可用。我相信这意味着它只查看网络接口,而不是该接口的真正连接状态。
  • @ryadavilli 同意,这也很重要
【解决方案4】:

请注意,我们使用的是 Windows.Networking.Connectivity.NetworkInformation 而不是 System.Net.NetworkInformation 命名空间。

public bool checkInternetAccess()
{
    var connectivityLevel = Windows.Networking.Connectivity.NetworkInformation
                           .GetInternetConnectionProfile().GetNetworkConnectivityLevel();

    return connectivityLevel == NetworkConnectivityLevel.InternetAccess;
}

基本上是ventura8所说的。我会评论他的解决方案,提到命名空间,但我缺乏足够的声誉。

【讨论】:

  • Windows.Networking.Connectivity 是在哪个程序集中找到的?
【解决方案5】:

来自 MSDN(重点是我的):

如果任何网络接口被标记为“up”并且不是环回或隧道接口,则认为网络连接可用。

如果“连接”是指 Internet 连接,那么您应该 DllImport 函数 InternetCheckConnectionInternetQueryOption

相反,如果您只需要知道计算机是否连接到任何有用 LAN,那么您可以做的最好的事情是自己迭代网络连接并过滤(使用NetworkInterfaceType,@ 987654325@ 和 OperationalStatus) 你也不感兴趣。

【讨论】:

    【解决方案6】:

    我想它会告诉我连接是否可用,但即使我确定没有连接,它也总是返回 true(并打印第一条消息)。

    您对“连接”的含义与手册有不同的看法。就操作系统而言,当有修补的以太网电缆连接到您的 NIC,或者当您的无线网卡连接到无线接入点,或者任何连接处于活动状态时,您就有了连接。

    手册也解释了这一点:

    NetworkInterface.GetIsNetworkAvailable:

    指示是否有任何网络连接可用。

    如果您想检测互联网连接,请查看WinINet API 中的InternetGetConnectedState()(或InternetCheckConnection(),以检查特定主机的可访问性)方法。

    【讨论】:

    • InternetCheckConnection 已被弃用(它实际上只执行 ping,.net 有更简单的方法)。
    猜你喜欢
    • 2020-01-29
    • 2012-04-03
    • 2021-09-11
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多