Какой самый быстрый и эффективный способ проверить подключение к Интернету в .NET?
c#
.net
internet-connection
Мохит Дешпанде
источник
источник
Windows NLM API
должен быть лучшим для этого. stackoverflow.com/questions/5405895/…Ответы:
Нечто подобное должно работать.
System.Net.WebClient
источник
I cannot image a world where www.google.com does not return some HTML
в Китае, например ...Нет абсолютно никакого способа надежно проверить, есть ли подключение к Интернету или нет (я предполагаю, что вы имеете в виду доступ к Интернету).
Однако вы можете запросить ресурсы, которые практически никогда не отключены, например, pinging google.com или что-то подобное. Я думаю, что это будет эффективно.
источник
8.8.8.8
или8.8.4.4
) работает нормально для меня.Beware - many schools and offices block the ping protocol.
если вы используете этот метод для приложения, которое будет использоваться клиентами, я бы посоветовал не использовать этот метод проверки интернетаВместо проверки просто выполните действие (веб-запрос, почта, ftp и т. Д.) И будьте готовы к сбою запроса, который вы должны будете выполнить в любом случае, даже если проверка прошла успешно.
Учтите следующее:
Если сеть не работает, ваше действие будет так же быстро, как пинг и т. Д.
источник
NetworkInterface.GetIsNetworkAvailable
очень ненадежный Просто подключите VMware или другую локальную сеть, и она вернет неправильный результат. Также оDns.GetHostEntry
методе, который меня беспокоил, может ли тестовый URL быть заблокирован в среде, в которой будет развернуто мое приложение.Итак, другой способ, который я узнал, - это использование
InternetGetConnectedState
метода Мой кодисточник
Тест для подключения к интернету с помощью пинг Google:
источник
Я не согласен с людьми, которые заявляют: «Какой смысл проверять подключение перед выполнением задачи, так как сразу после проверки соединение может быть потеряно». Конечно, существует определенная степень неопределенности во многих задачах программирования, которые мы, как разработчики, берем на себя, но уменьшение этой неопределенности до уровня приемлемости является частью проблемы.
Недавно я столкнулся с этой проблемой при создании приложения, включающего функцию сопоставления, которая связана с онлайн-сервером плиток. Эта функция должна была быть отключена, когда было отмечено отсутствие подключения к Интернету.
Некоторые ответы на этой странице были очень хорошими, но, тем не менее, вызывали много проблем с производительностью, таких как зависание, в основном в случае отсутствия подключения.
Вот решение, которое я в итоге использовал, с помощью некоторых из этих ответов и моих коллег:
источник
Я видел все варианты, перечисленные выше, и единственная реальная возможность проверить, доступен ли Интернет или нет, это опция «Пинг». Импортирование
[DllImport("Wininet.dll")]
и /System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
или любое другое изменениеNetworkInterface
класса не помогает определить доступность сети. Эти методы только проверяют, подключен ли сетевой кабель или нет.Опция "Пинг"
if
(Соединение доступно) возвращаетtrue
if
(Соединение недоступно и сетевой кабель подключен) возвращаетfalse
if
(Сетевой кабель не подключен)Throws an exception
Сетевой интерфейс
if
(Интернет доступен) ВозвращаетTrue
if
(Интернет недоступен и сетевой кабель подключен) ВозвращаетTrue
if
(Сетевой кабель не подключен) возвращаетfalse
[DllImport ("Wininet.dll")]
if
(Интернет доступен) ВозвращаетTrue
if
(Интернет недоступен и сетевой кабель подключен) ВозвращаетTrue
if
(Сетевой кабель не подключен) возвращаетfalse
Так что в случае
[DllImport("Wininet.dll")]
иNetworkInterface
нет никакого способа узнать, доступно ли подключение к интернету.источник
Не решает проблему сбоя сети между проверкой и запуском вашего кода, но достаточно надежна
источник
Пинг google.com вводит зависимость разрешения DNS. Pinging 8.8.8.8 - это нормально, но Google находится в нескольких шагах от меня. Все, что мне нужно сделать, это пинговать ближайшую ко мне вещь, которая есть в интернете.
Я могу использовать функцию TTL в Ping для проверки связи № 1, затем перехода № 2 и т. Д., Пока не получу ответ от чего-то, что находится на маршрутизируемом адресе; если этот узел находится на маршрутизируемом адресе, то он находится в Интернете. Для большинства из нас переход № 1 будет нашим локальным шлюзом / маршрутизатором, а переход № 2 будет первой точкой на другой стороне нашего оптоволоконного соединения или чем-то еще.
Этот код работает для меня, и отвечает быстрее, чем некоторые другие предложения в этой теме, потому что он пингует все, что ближе всего ко мне в Интернете.
источник
Вот как это реализовано в Android.
В качестве подтверждения концепции я перевел этот код на C #:
источник
источник
Другой вариант - API-интерфейс Network List Manager, который доступен для Vista и Windows 7. Статья MSDN здесь . В статье есть ссылка для скачивания примеров кода, которые позволяют сделать это:
Обязательно добавьте ссылку на библиотеку типов сети List 1.0 на вкладке COM, которая будет отображаться как NETWORKLIST.
источник
Старайтесь избегать тестирования соединений, перехватывая исключение. потому что мы действительно ожидаем, что иногда мы можем потерять подключение к сети.
источник
Если вы хотите уведомить пользователя / выполнить действие при каждом изменении сети / соединения.
Использовать NLM API:
https://msdn.microsoft.com/en-us/library/ee264321.aspx
http://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of
источник
Лично я считаю, что Антон и Моффельте лучше всего отвечают , но я добавил проверку, чтобы исключить виртуальные сети, созданные VMWare и другими.
источник
источник
bb
что все равно будет верно, даже если сеть не подключена к Интернету.Многопоточная версия ping:
источник
Я не думаю, что это невозможно, просто не так просто.
Я построил что-то вроде этого, и да, это не идеально, но первый шаг важен: проверить, есть ли сетевое подключение. Windows Api не делает большую работу, так почему бы не сделать лучшую работу?
Это довольно просто, но действительно помогает улучшить качество проверки, особенно когда вы хотите проверить различные конфигурации прокси.
Так:
источник
источник
Используйте NetworkMonitor для мониторинга состояния сети и интернет-соединения.
Образец:
источник
Введение
В некоторых сценариях вам необходимо проверить, доступен ли Интернет или нет, используя код C # в приложениях Windows. Может быть, чтобы загрузить или загрузить файл через Интернет в формах Windows или получить некоторые данные из базы данных, которая находится в удаленном месте, в этих ситуациях проверка интернета является обязательной.
Есть несколько способов проверить доступность Интернета с помощью C # из кода. Все такие способы описаны здесь, включая их ограничения.
API 'wininet' можно использовать для проверки наличия или отсутствия локальной системы с подключением к Интернету. Используемое для этого пространство имен - System.Runtime.InteropServices и импортируйте dll «wininet.dll» с помощью DllImport. После этого создайте логическую переменную с extern static с именем функции InternetGetConnectedState с описанием двух параметров и reservedValue, как показано в примере.
Примечание. Модификатор extern используется для объявления метода, который реализован извне. Обычно используется модификатор extern с атрибутом DllImport, когда вы используете сервисы Interop для вызова неуправляемого кода. В этом случае метод также должен быть объявлен как статический.
В следующем примере метод GetIsNetworkAvailable используется для определения доступности сетевого подключения.
Примечания (согласно MSDN): сетевое соединение считается доступным, если какой-либо сетевой интерфейс помечен как «вверх» и не является петлевым или туннельным интерфейсом.
Во многих случаях устройство или компьютер не подключены к полезной сети, но все еще считаются доступными, и GetIsNetworkAvailable возвращает значение true. Например, если устройство, на котором запущено приложение, подключено к беспроводной сети, для которой требуется прокси-сервер, но прокси-сервер не задан, GetIsNetworkAvailable вернет значение true. Другой пример того, когда GetIsNetworkAvailable вернет true, - это если приложение работает на компьютере, который подключен к концентратору или маршрутизатору, где концентратор или маршрутизатор потерял восходящее соединение.
Классы Ping и PingReply позволяют приложению определять, доступен ли удаленный компьютер по сети, путем получения ответа от хоста. Эти классы доступны в пространстве имен System.Net.NetworkInformation. В следующем примере показано, как проверить связь с хостом.
Примечания (согласно MSDN). Приложения используют класс Ping для определения доступности удаленного компьютера. Топология сети может определить, может ли Ping успешно связаться с удаленным хостом. Наличие и настройка прокси-серверов, оборудования для преобразования сетевых адресов (NAT) или брандмауэров могут помешать выполнению Ping. Успешный Ping указывает только на то, что удаленный хост может быть доступен в сети; присутствие сервисов более высокого уровня (таких как веб-сервер) на удаленном хосте не гарантируется.
Комментарии / предложения приветствуются. Удачного кодирования ......!
источник
Для моего приложения мы также тестируем путем загрузки крошечного файла.
Также. Некоторые интернет-провайдеры могут использовать промежуточный сервер для кэширования файла. Добавить случайный неиспользуемый параметр, например. https://www.microsoft.com/favicon.ico?req=random_number Может предотвратить кэширование.
источник
У меня проблема с этим методом на моем 3G маршрутизаторе / модеме, потому что, если интернет отключен, маршрутизатор перенаправляет страницу на свою страницу ответа, так что вы все равно получаете пар и ваш код думает, что есть интернет. У яблок (или других) есть страница определения горячих точек, которая всегда возвращает определенный ответ. Следующий пример возвращает ответ «Успех». Таким образом, вы будете точно уверены, что сможете подключиться к Интернету и получить реальный ответ!
источник
У меня есть три теста для подключения к Интернету.
System.Net
иSystem.Net.Sockets
Тест 1
Тест 2
Тест 3
Выполнение тестов
Если вы сделаете
Dictionary
изString
иBoolean
позвонилиCheckList
, вы можете добавить результаты каждого теста вCheckList
.Теперь пройдитесь по каждому из них,
KeyValuePair
используяfor...each
цикл.Если
CheckList
содержитValue
оtrue
, то вы знаете, что есть подключение к Интернету.источник
Это работает
источник