C#. Как определить состояние подключения к интернету
В библиотеке .NET нет функции для проверки состояния подключения к интернету. Для проверки состояния и получения некоторых настроек можно использовать функцию InternetGetConnectedState из библиотеки WINAPI. Эту функцию можно использовать для различных протоколов, типа: Gopher, FTP и HTTP. В использовании InternetGetConnectedState нет ничего сложного. Эта функция импортируется из библиотеки WININET и после использования возвращает True или False, при этом в заданную переменную записывается значение, которое впоследствии сравнивается с константами.
Функция позволяет определять посредством чего выполнено подключение к интернету (модем или LAN), используется ли proxy и установлен ли RAS(Remote Access Service).
Первым делом создаем класс InternetConnection и задаем константы:
[Flags]
public enum InternetConnectionState : int
{
INTERNET_CONNECTION_MODEM = 0x1,
INTERNET_CONNECTION_LAN = 0x2,
INTERNET_CONNECTION_PROXY = 0x4,
INTERNET_RAS_INSTALLED = 0x10,
INTERNET_CONNECTION_OFFLINE = 0x20,
INTERNET_CONNECTION_CONFIGURED = 0x40
}
Импортируем нужную нам функцию из библиотеки WININET:
[DllImport("WININET", CharSet = CharSet.Auto)]
static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);
Пишем метод Init, в котором будет проходить вся инициализация:
public void Init()
{
InternetConnectionState flags = 0;
isInternetConnected = InternetGetConnectedState(ref flags, 0);
isUsingModem = (flags & InternetConnection-State.INTERNET_CONNECTION_MODEM) != 0;
isUsingLAN = (flags & InternetConnectionState.INTERNET_CONNECTION_LAN) != 0;
isOffline = (flags & InternetConnection-State.INTERNET_CONNECTION_OFFLINE) != 0;
isUsingProxy = (flags & InternetConnection-State.INTERNET_CONNECTION_PROXY) != 0;
isRasEnabled = (flags & InternetConnectionState.INTERNET_RAS_INSTALLED) != 0;
}
После этого, доступ к переменным можно получить таким вот образом:
InternetConnection inet = new InternetConnection();
inet.Init();
Console.WriteLine("Соединение с интернетом: " + inet.IsInternetConnected);
Console.WriteLine("В оффлайне: " + inet.IsOffline);
Console.WriteLine("Посредством модема: " + inet.IsUsingModem);
Console.WriteLine("Посредством LAN: " + inet.IsUsingLAN);
Console.WriteLine("Используется proxy: " + inet.IsUsingProxy);
Console.WriteLine("Установлен ли RAS: " + inet.IsRasEnabled);
Класс InternetConnection вы можете использовать в своих программах для определения подключения к интернету.
Удачного вам кодинга. Исходный код тестового проекта.
Популярность: 10%
Если у вас возникли вопросы, вы можете оставить их в комментариях


Спасибо, очень наглядно и как раз, то что надо. А то предлагали костыли использовать в виде всевозможных пингов куда попало =)
Интересно какой программист писал эту статью?
Как раз в .NET библиотеке есть функция для проверки состояния подключения к интернету.
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
которая возвращает true если подключен и false если нет.
Писал Я, о System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() ничего не знал. Если NetworkInformation позволяет получить ту же информацию, что и в статье, тогда заранее вам спасибо. =)
В .NET действительно есть эта функция ))) Но автору отдельное спасибо за то, что показал информацию на более низком уровне. Оч полезно и познавательно ))))
*Интересно какой программист писал эту статью?
Как раз в .NET библиотеке есть функция для проверки состояния подключения к интернету.
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
которая возвращает true если подключен и false если нет. *
вообще то System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() не различает подключения к интернету от простого локального. Так что в этом есть смысл.