14

我有这个方法:

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(并打印第一条消息)。我做错了什么?

PS:我还在学习C#。

4

6 回答 6

16

我认为这种方法更合适:

   public static bool getIsInternetAccessAvailable()
    {
        switch(NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel())
        {
            case NetworkConnectivityLevel.InternetAccess:
                return true;
            default:
                return false;
        }
    }
于 2014-10-17T11:30:22.787 回答
12

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

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

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

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

注意:最新的编辑是由AceInfinity提出的,但在社区审核中被拒绝。我的声誉太低,无法覆盖这一点,所以我自己做出了改变。

于 2012-11-19T16:04:22.037 回答
3

来自msdn

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

这些示例之一可能是您的情况:

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

于 2012-11-19T15:59:41.393 回答
3

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

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

    return connectivityLevel == NetworkConnectivityLevel.InternetAccess;
}

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

于 2015-08-20T12:38:50.980 回答
1

来自 MSDN(重点是我的):

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

如果“连接”是指 Internet 连接,那么您应该DllImport使用InternetCheckConnectionInternetQueryOption.

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

于 2012-11-19T16:02:18.743 回答
1

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

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

该手册还解释了这一点:

NetworkInterface.GetIsNetworkAvailable

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

如果您想检测 Internet 连接,请查看WinINet APIInternetGetConnectedState()中的(或InternetCheckConnection()检查特定主机的可访问性)方法。

于 2012-11-19T16:05:03.710 回答