Всем привет, возник вопрос по проверке подключения к интернет, ребята посоветуйте пожалуйста как лучше, буду очень благодарен!
В моей программе(winforms net 2.0) стоит задача периодически проверять подключение к интернет. Я бы не хотел использовать многопоточную модель и в моей программе алгоритмы в основном работают в синхронном режиме.
Сначала для проверки интернет я попробовал использовать функции WinInet InternetGetCconnectedState и InternetCheckConnection. Первая функция в ряде случаев выдавала положительный результат при отсутствии интернет, а вторая функция в случаях, когда невозможно разрешить адрес интернет-хоста по имени, замораживала основной поток программы до истечения тайм-аута.
Я написал функцию, которая ждет разрешение адреса или ответ от тестового сервера, какое-то фиксированное количество времени.
static Ping ping = new Ping();
public static bool IsInternetConnectionAvailable()
{
try
{
IAsyncResult ares = Dns.BeginGetHostEntry("sdfsdfsdfsdfsdfsdf", null, null);
DateTime endWait = DateTime.Now.AddMilliseconds(1000);
while (DateTime.Now < endWait && ares.IsCompleted == false) Thread.Sleep(0);
int elapsedTimeout = (int)endWait.Subtract(DateTime.Now).TotalMilliseconds;
if (ares.IsCompleted && elapsedTimeout > 0)
{
IPHostEntry _h = Dns.EndGetHostEntry(ares);
foreach (IPAddress address in _h.AddressList)
{
PingReply reply = ping.Send(address, elapsedTimeout);
if (reply.Status == IPStatus.Success) return true;
if ((elapsedTimeout -= (int)reply.RoundtripTime) <= 0) break;
}
}
}
catch (Exception ex)
{
Debug.Fail("Ошибка при проверке подключения к интернет: " + Environment.NewLine + ex.Message);
}
return false;
}
Эта функция вроде работает, но скажите пожалуйста, будет ли она работать надежно? Как я понимаю вызов Dns.BeginGetHostEntry создает новый поток в приложении, который, если я не ошибаюсь, может работать секунд 20 или 30 или сколько длится таймаут неудачного разрешения ip адреса. Я сымитировал ситуацию, когда адрес хоста невозможно получить по имени и попробовал вызвать эту функцию несколько раз в течение короткого промежутка времени и visual studio показала, что в программе появилось несколько потоков. Также я попробовал вызывать эту функцию много раз, количество дополнительных потоков не превысило восьми-десяти(кажется), но никаких ексепшнов в функции не возникло и функция честно выдавала ответ о недоступности хоста.
Пока писал я подумал о том, что неплохо бы , чтобы в интернете был какой-нибудь хост с неизменным IP и который бы отвечал всегда на пинг или имел всегда открытый 80 порт. Тогда мне кажется моя задача упростилась и мне нужно было бы разрешать имя в асинхронном режиме. Такое возможно?
Re: Проверка подключения к интернет в синхронном режиме
Здравствуйте, islvap, Вы писали:
I> Всем привет, возник вопрос по проверке подключения к интернет, ребята посоветуйте пожалуйста как лучше, буду очень благодарен!
I> В моей программе(winforms net 2.0) стоит задача периодически проверять подключение к интернет. Я бы не хотел использовать многопоточную модель и в моей программе алгоритмы в основном работают в синхронном режиме.
Не завидую я вашим пользователям, ибо не заботитесь вы о них нисколько...
I> Пока писал я подумал о том, что неплохо бы , чтобы в интернете был какой-нибудь хост с неизменным IP и который бы отвечал всегда на пинг или имел всегда открытый 80 порт.
Таких серверов порядка нескольких миллионов — выбирайте любой...
Здравствуйте, islvap, Вы писали:
I> Всем привет, возник вопрос по проверке подключения к интернет, ребята посоветуйте пожалуйста как лучше, буду очень благодарен!
Видите-ли, чтобы получить правильный ответ, зачастую — от самого себя, нужно прежде всего правильно сформулировать вопрос У Вас же, на мой взгляд, присутствуют минимум две ошибки именно в самом вопросе.
Во-первых,
I> В моей программе(winforms net 2.0) стоит задача периодически проверять подключение к интернет.
Простите, не верю Проверка наличия подключения сама по себе довольно-таки бессмысленна. Наверняка у Вас стоит совсем другая задача. Скорее всего Вы считаете, что проверив наличие "подключения к интернет", Вы решите свою задачу. Но это совсем ещё не факт. Более того, скорее всего это вообще не имеет отношения к Вашей задаче, и причиной тому — ошибка номер два.
проверять подключение к интернет
— а что такое "подключение к интернет"? Или даже так — что такое "интернет", к которому якобы можно подключиться и, соответственно, проверять наличие такого подключения? Ну ладно, не будем буквоедствовать, но всё равно, что Вам даст возможность подключиться к какому-нибудь серверу в Австралии, о котором Вы ничего не знаете?
И пожалуйста, не торопитесь обижаться, сначала всё таки постарайтесь обдумать сказанное
"Нормальные герои всегда идут в обход!"
Re[2]: Проверка подключения к интернет в синхронном режиме
K>Таких серверов порядка нескольких миллионов — выбирайте любой...
я выбрал например rsdn.ru , microsoft.com вы уверены, что ближайшие два-три года у них будет неизменный IP и они будут отвечать на пинг и доступны 24 часа в сутки?
Re[2]: Проверка подключения к интернет в синхронном режиме
Спасибо большое за ответ. Я специально, чтобы не раздувать первое сообщение не приводил ТЗ и не обосновывал почему я выбрал тот или иной способ реализации.
Задача в общем стоит так: у компании есть договор о предоставлении беспроводного доступа в интернет с несколькими крупными операторами связи. Менеджеры компании пока в офисах, на своих ноутбуках работают с интернет через внутреннюю сеть, а когда ездят где-то по объектам, компьютер должен сам искать способы выхода в интрнет и сигнализировать об этом пользователям. У программы нет никакого интрфейса, только значок в трее с логотипом компании зеленого или красного цвета. Программа периодически проверяет наличие интернет, и если интернет недоступен, программа ищет беспроводные сети операторов связи и подключается через них к интернет, избавляя пользователя от рутинной работы; если подключение установить удалось, то значок становится зеленым, если подключение пропало и доступных сетей нет, то красным. Медеджер может использовать интернет как угодно, может на мейл.ру зайти, или на сайт компании, хз. может порнуху посмотреть. В качестве тестового хоста, доступность которого определяет наличие интернет я выбрал компьютер с сайтом компании.
Re[3]: Проверка подключения к интернет в синхронном режиме
Ну вот видите, оказывается, весь интернет Вам не нужен, а то я уж ипугался — весь выкачаете, мне не достанется К сожаления. мне с подобного рода задачами сталкиваться не приходилось, но думаю, что Вам нужно не связь проверять, а наличие соединения с провайдером. Вероятно для каждого провайдера создаётся отдельное соединение, и они доступны через RAS API, попробуйте посмотреть в этом направлении. Там, к примеру, есть функция RasGetConnectStatus. При этом совершенно не стоит бояться дополнительного потока. Этот поток может работать совершенно независимо от основного, и просто выстывлять-сбрасывать глобальный флаг. А основной поток может периодически смотреть состояние этого флага и состояние самого доп. потока.
"Нормальные герои всегда идут в обход!"
Re[4]: Проверка подключения к интернет в синхронном режиме
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, islvap, Вы писали:
JR>Ну вот видите, оказывается, весь интернет Вам не нужен, а то я уж ипугался — весь выкачаете, мне не достанется К сожаления. мне с подобного рода задачами сталкиваться не приходилось, но думаю, что Вам нужно не связь проверять, а наличие соединения с провайдером. Вероятно для каждого провайдера создаётся отдельное соединение, и они доступны через RAS API, попробуйте посмотреть в этом направлении. Там, к примеру, есть функция RasGetConnectStatus. При этом совершенно не стоит бояться дополнительного потока. Этот поток может работать совершенно независимо от основного, и просто выстывлять-сбрасывать глобальный флаг. А основной поток может периодически смотреть состояние этого флага и состояние самого доп. потока.
нет, все реализовано и работает. У меня сомнения в надежности того фрагмента кода, который я привел, о чём я и спросил собственно.
Здравствуйте, islvap, Вы писали:
I>Задача в общем стоит так: у компании есть договор о предоставлении беспроводного доступа в интернет с несколькими крупными операторами связи. Менеджеры компании пока в офисах, на своих ноутбуках работают с интернет через внутреннюю сеть, а когда ездят где-то по объектам, компьютер должен сам искать способы выхода в интрнет и сигнализировать об этом пользователям.
Я может чего-то не понимаю, но стандартный менеджер беспроводной связи Windows так себя и ведёт. Периодически щупает точки и если настроен профиль автовхода, то выполняет подключение. Значки стандартные. Рутины там нет, один раз настроил параметры и пароли, и забыл.
Здравствуйте, akasoft, Вы писали:
A>Я может чего-то не понимаю, но стандартный менеджер беспроводной связи Windows так себя и ведёт. Периодически щупает точки и если настроен профиль автовхода, то выполняет подключение. Значки стандартные. Рутины там нет, один раз настроил параметры и пароли, и забыл.
Более того — он еще и для всех коннектов (LAN, Modem, Wifi) умеет каким-то образом отличать "internet connectivity" от "intranet connectivity". Это в семёрке. Я пока так и не понял, как он это делает.
Но вот с моим homenet-провайдером, который требует запуска специальной софтины для "разблокирования большого интернета" семёрка практически не ошибается. Иногда только тупит некоторое время.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Более того — он еще и для всех коннектов (LAN, Modem, Wifi) умеет каким-то образом отличать "internet connectivity" от "intranet connectivity". Это в семёрке. Я пока так и не понял, как он это делает.
Думаю, обращается на windows update или ещё к каким внутренним серверам. Если отзываются, то типа интернет. Точнее может сказать tcpview. Или посмотреть на сервере, куда NAT переводит пакеты.