Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
C#, проверить соединение с Интернетом.



Похоже, самый надежный способ проверить соединение с Интернетом, это сделать запрос к какому-нибудь редко падающему сайту, например google.com или microsoft.com. Хотя в ГОРФ хрен знает, что завтра заблокируют :).
Как я понимаю, седьмая и десятая винда примерно так и поступают, периодически обращаясь к каким-то майкрософтовским серверам.
В сети рекомендуют способ с NetworkInterface.GetIsNetworkAvailable() или экспортировать функцию InternetGetConnectedState из wininet.dll, однако у меня оба способа нагло врали, показывая наличие интернета при его отсутствии, но при наличии подключения к локальной сети или VPN. Сделать Ping тоже не всегда возможно, ICMP могут быть вырублены на стороне провайдера (или сервера). Так что пока способа лучше, чем сообразить запрос с помощью HttpWebRequest не нашел.

При этом способе, правда, есть два небольших подводных камня. Первый ВНЕЗАПНЫЙ, оказывается, ответ на запрос все-таки надо прочесть, хотя сам ответ в данном случае и не особо интересен, для проверки достаточно отловить код ошибки в try/catch примерно так:

request = (HttpWebRequest)HttpWebRequest.Create(URL);

//[...]

try
{
    resp = (HttpWebResponse)request.GetResponse();
    //не вывалились в ошибку, значит все OK

    Stream temp = resp.GetResponseStream(); //если не прочитать поток ответа
    //случается потеря соединения при повторном запросе (сам в шоке)
    StreamReader sr = new StreamReader(temp);
    sr.ReadToEnd();
	
	//Обрабатываем случай когда все ОК
}
catch (WebException ex)
{
	//Обрабатываем ошибку соединения
}


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

Пример на GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2018/05/17/c-proverit-soedinenie-s-internetom/

Tags: ,
Comments

А теперь вопрос на засыпку: поддерживает ли HttpWebRequest настройки прокси?

Мелкософтовская проверялка, например, не поддерживает: на рабочем компе упрямо показывает "нет доступа к Интернету", хотя он есть -- но только через проксю.

Поддерживает. Проблема была только одна - скормить "системные настройки прокси", те которые в IE. Если задавать прокси вручную (или отсутствие прокси), вообще проблем нет. "Системные" пришлось задавать, меняя глобальную настройку HttpWebRequest, просто прокси задавать/или задать "без прокси" - получалось для каждого запроса в отдельности (специально как-то поебался и установил аж три локальных прокси, чтоб посмотреть). Хотя, может быть и системные можно для каждого отдельного запроса менять (включать или отключать), но я не понял, как интерфейс (IWebProxy) преобразовать в WebProxy

вот здесь есть

в конструкции switch (ConnectionType)

Замечательно!

А то блин программисты привыкли сидеть с прямым коннектом в инет, и обрезанным пользователям через это сплошные страдания.

Именно что. Да и программистам. Случае разныя бывают, если сидишь на виртуальной машине, на прокси, а остальное, за сервером, за NAT-ом, за локалкой офиса, за еще NAT-ом, за локалкой и NAT-ом провайдера... Или через спутниковый/просто кривой самодельный инет от недопровайдера в деревне (оно обычно где-нибудь в одном месте висит, а по домикам раздается через проксю).