У меня есть этот метод:
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.: Я все еще изучаю С#.
Пожалуйста, исправьте меня, если я ошибаюсь, но насколько я вижу, метод, который вы используете, - это проверка сетевого подключения, а не подключение к интернету. Я бы предположил, что если вы находитесь в какой-либо сети, это вернет истину, независимо от доступности Интернета или нет? См. 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, но было отклонено в обзоре сообщества. Моя репутация слишком низкая, чтобы переопределить это, поэтому я сделал изменение самостоятельно.
Я думаю, что этот метод более уместен:
public static bool getIsInternetAccessAvailable()
{
switch(NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel())
{
case NetworkConnectivityLevel.InternetAccess:
return true;
default:
return false;
}
}
.GetInternetConnectionProfile()
. Потянув за сетевой кабель для имитации сбоя, он получил нулевой результат вместо объекта, который GetNetworkConnectivityLevel()
отключенное состояние от GetNetworkConnectivityLevel()
.
Из msdn:
Существует много случаев, когда устройство или компьютер не подключены к полезная сеть, но по-прежнему считается доступной и GetIsNetworkAvailable вернет true.
Одним из таких примеров может быть ваш случай:
Например, если устройство запуск приложения подключен к беспроводной сети, которая требует прокси, но прокси не установлен, GetIsNetworkAvailable будет return true. Другой пример возврата GetIsNetworkAvailable true - если приложение запущено на подключенном компьютере к концентратору или маршрутизатору, где концентратор или маршрутизатор потеряли восходящий поток соединение.
Обратите внимание, что мы используем Windows.Networking.Connectivity.NetworkInformation, а не пространство имен System.Net.NetworkInformation.
public bool checkInternetAccess()
{
var connectivityLevel = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel();
return connectivityLevel == NetworkConnectivityLevel.InternetAccess;
}
В основном, что сказал ventura8. Я хотел бы прокомментировать его решение, отметив пространства имен, но мне не хватает репутации.
Я предполагаю, что это скажет мне, доступно ли соединение или нет, но оно всегда возвращает true (и печатает первое сообщение), даже если я уверен, что нет соединения.
У вас другое мнение о значении "соединения", чем в руководстве. Что касается операционной системы, у вас есть соединение, когда есть подключенный к сетевой карте исправленный сетевой кабель или когда ваша беспроводная карта подключена к точке беспроводного доступа или какое-либо соединение активно.
В руководстве также объясняется следующее:
NetworkInterface.GetIsNetworkAvailable:
Указывает, доступно ли любое сетевое подключение.
Если вы хотите обнаружить подключение к Интернету, посмотрите InternetGetConnectedState()
(или InternetCheckConnection()
, чтобы проверить возможности доступа к конкретному хосту) из API WinINet.
Из MSDN (акцент мой):
Подключение к сети считается доступны, если любой сетевой интерфейс отмечен "вверх" и не является петлевой или туннельный интерфейс.
Если с "соединением" вы подразумеваете подключение к Интернету, вы должны DllImport
выполнить функцию "InternetCheckConnection" или InternetQueryOption
.
Вместо того, чтобы, если что вам нужно только знать, если компьютер подключен к любой полезной локальной сети самое лучшее, что вы можете сделать, это перебирать подключение к сети самостоятельно и отфильтровать (используя NetworkInterfaceType, IsReceiveOnly
и OperationalStatus
), что вам тоже не интересно.