Подтвердить что ты не робот

Почему GetIsNetworkAvailable() всегда возвращает true?

У меня есть этот метод:

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.: Я все еще изучаю С#.

4b9b3361

Ответ 1

Пожалуйста, исправьте меня, если я ошибаюсь, но насколько я вижу, метод, который вы используете, - это проверка сетевого подключения, а не подключение к интернету. Я бы предположил, что если вы находитесь в какой-либо сети, это вернет истину, независимо от доступности Интернета или нет? См. this.

Я заметил, что один способ проверки подключения к Интернету выглядит следующим образом:

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

Вышеприведенный код можно найти (в VB.Net, прочитав комментарий от Joacim Andersson [MVP]) в следующем post.

Примечание. Последнее изменение было предложено AceInfinity, но было отклонено в обзоре сообщества. Моя репутация слишком низкая, чтобы переопределить это, поэтому я сделал изменение самостоятельно.

Ответ 2

Я думаю, что этот метод более уместен:

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

Ответ 3

Из msdn:

Существует много случаев, когда устройство или компьютер не подключены к полезная сеть, но по-прежнему считается доступной и GetIsNetworkAvailable вернет true.

Одним из таких примеров может быть ваш случай:

Например, если устройство запуск приложения подключен к беспроводной сети, которая требует прокси, но прокси не установлен, GetIsNetworkAvailable будет return true. Другой пример возврата GetIsNetworkAvailable true - если приложение запущено на подключенном компьютере к концентратору или маршрутизатору, где концентратор или маршрутизатор потеряли восходящий поток соединение.

Ответ 4

Обратите внимание, что мы используем Windows.Networking.Connectivity.NetworkInformation, а не пространство имен System.Net.NetworkInformation.

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

        return connectivityLevel == NetworkConnectivityLevel.InternetAccess;
    }

В основном, что сказал ventura8. Я хотел бы прокомментировать его решение, отметив пространства имен, но мне не хватает репутации.

Ответ 5

Из MSDN (акцент мой):

Подключение к сети считается доступны, если любой сетевой интерфейс отмечен "вверх" и не является петлевой или туннельный интерфейс.

Если с "соединением" вы подразумеваете подключение к Интернету, вы должны DllImport выполнить функцию "InternetCheckConnection" или InternetQueryOption.

Вместо того, чтобы, если что вам нужно только знать, если компьютер подключен к любой полезной локальной сети самое лучшее, что вы можете сделать, это перебирать подключение к сети самостоятельно и отфильтровать (используя NetworkInterfaceType, IsReceiveOnly и OperationalStatus), что вам тоже не интересно.

Ответ 6

Я предполагаю, что это скажет мне, доступно ли соединение или нет, но оно всегда возвращает true (и печатает первое сообщение), даже если я уверен, что нет соединения.

У вас другое мнение о значении "соединения", чем в руководстве. Что касается операционной системы, у вас есть соединение, когда есть подключенный к сетевой карте исправленный сетевой кабель или когда ваша беспроводная карта подключена к точке беспроводного доступа или какое-либо соединение активно.

В руководстве также объясняется следующее:

NetworkInterface.GetIsNetworkAvailable:

Указывает, доступно ли любое сетевое подключение.

Если вы хотите обнаружить подключение к Интернету, посмотрите InternetGetConnectedState() (или InternetCheckConnection(), чтобы проверить возможности доступа к конкретному хосту) из API WinINet.