Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Проверка подключения к интернету

#c_sharp


Нужен код который будет проверять подключение к интернету, если true то действия
программы продолжаются, а если false то действия программы останавливаются. Находил
много кодов, но если подключена локальная сеть то они показывали true.    


Ответы

Ответ 1



Все примеры шли наверно с применением функции InternetGetConnectedState, которая возвращает true даже если установлено LAN соединение. Но у нее есть флаги, которое будет содержать описание соединения. using System; using System.Runtime; using System.Runtime.InteropServices; public class InternetCS { [DllImport("wininet.dll")] private extern static bool InternetGetConnectedState( out int Description, int ReservedValue ); public static bool IsConnectedToInternet( ) { int Desc ; return InternetGetConnectedState( out Desc, 0 ) ; } } В Desc как раз содержится описание, значения можно посмотреть тут. Пара примеров: INTERNET_CONNECTION_LAN 0x02 INTERNET_CONNECTION_MODEM 0x01 Тут вопрос теперь такой, что будет содержаться в Desc если существует и LAN и доступ в интернет? Пробуйте, и тестируйте. Второй вариант проще, просто пытаемся послать запрос к сайту: WebClient Client = new WebClient (); String Response; Response = Client.DownloadString("http://www.google.com"); и проверить ответ. Но тут, конечно зависит от сайта, который укажите, а вдруг он упал? Хотя, windows вроде как, проверяет доступ к интернету путем пинга сайта microsoft.com. Так же, у гугла есть DNS сервер. По адресу: 8.8.8.8. Поэтому мой вариант пинговать этот адрес и все.

Ответ 2



Начиная с Windows Vista в системе есть инструмент для проверки интернет-соединения. Это Network Awareness on Windows Vista. Вы можете использовать тот же механизм в приложении на C#. using System.Net; using System.IO; public static class ConnectivityChecker { public enum ConnectionStatus { NotConnected, LimitedAccess, Connected } public static ConnectionStatus CheckInternet() { // Проверить подключение к dns.msftncsi.com try { IPHostEntry entry = Dns.GetHostEntry("dns.msftncsi.com"); if (entry.AddressList.Length == 0) { return ConnectionStatus.NotConnected; } else { if (!entry.AddressList[0].ToString().Equals("131.107.255.255")) { return ConnectionStatus.LimitedAccess; } } } catch { return ConnectionStatus.NotConnected; } // Проверить загрузку документа ncsi.txt HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.msftncsi.com/ncsi.txt"); try { HttpWebResponse responce = (HttpWebResponse)request.GetResponse(); if (responce.StatusCode != HttpStatusCode.OK) { return ConnectionStatus.LimitedAccess; } using (StreamReader sr = new StreamReader(responce.GetResponseStream())) { if (sr.ReadToEnd().Equals("Microsoft NCSI")) { return ConnectionStatus.Connected; } else { return ConnectionStatus.LimitedAccess; } } } catch { return ConnectionStatus.NotConnected; } } }

Ответ 3



bool inet_connect() { int fsockopen; char ip[15] = "46.182.85.8"; int port = "80"; int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); WSADATA WsaData; if (int err = WSAStartup(MAKEWORD(2, 0), &WsaData) != 0) { return false; } if (sock == -1) { return false; } sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = inet_addr(ip); fsockopen = connect(sock, (sockaddr *) & addr, sizeof(addr)); if (fsockopen != 0) { return false; } else { return true; } }

Комментариев нет:

Отправить комментарий