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

13

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

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

  • 0
    @TimSchmelter Я не понимаю, это пустая страница. Оооооо;)
Теги:
networking

6 ответов

10
Лучший ответ

Пожалуйста, исправьте меня, если я ошибаюсь, но насколько я вижу, метод, который вы используете, - это проверка сетевого подключения, а не подключение к интернету. Я бы предположил, что если вы находитесь в какой-либо сети, это вернет истину, независимо от доступности Интернета или нет? См. 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, но было отклонено в обзоре сообщества. Моя репутация слишком низкая, чтобы переопределить это, поэтому я сделал изменение самостоятельно.

  • 0
    Это всегда вернет ложь в Китае.
  • 0
    Это прискорбно. Это для всех исходящих звонков в Китае или только для таких сайтов, как Google, которые, я полагаю, заблокированы?
15

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

   public static bool getIsInternetAccessAvailable()
    {
        switch(NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel())
        {
            case NetworkConnectivityLevel.InternetAccess:
                return true;
            default:
                return false;
        }
    }
  • 2
    Что такое директива using? Я не могу найти метод GetInternetConnectionProfile.
  • 1
    Вам нужна нулевая проверка на этом .GetInternetConnectionProfile() . Потянув за сетевой кабель для имитации сбоя, он получил нулевой результат вместо объекта, который GetNetworkConnectivityLevel() отключенное состояние от GetNetworkConnectivityLevel() .
Показать ещё 1 комментарий
3

Из msdn:

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

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

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

  • 1
    Чтобы добавить, замечания для GetIsNetworkAvailable () гласят: «Сетевое соединение считается доступным, если какой-либо сетевой интерфейс помечен как« вверх »и не является петлевым или туннельным интерфейсом». Я считаю, что это означает, что он смотрит только на сетевой интерфейс, а не на состояние соединения для этого интерфейса.
  • 0
    @ryadavilli согласен, это тоже важно
2

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

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

        return connectivityLevel == NetworkConnectivityLevel.InternetAccess;
    }

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

1

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

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

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

NetworkInterface.GetIsNetworkAvailable:

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

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

1

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню