Проверка подключения к интернет в синхронном режиме
От: islvap  
Дата: 19.12.09 22:31
Оценка:
Всем привет, возник вопрос по проверке подключения к интернет, ребята посоветуйте пожалуйста как лучше, буду очень благодарен!

В моей программе(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: Проверка подключения к интернет в синхронном режиме
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 20.12.09 02:08
Оценка:
Здравствуйте, islvap, Вы писали:

I> Всем привет, возник вопрос по проверке подключения к интернет, ребята посоветуйте пожалуйста как лучше, буду очень благодарен!


I> В моей программе(winforms net 2.0) стоит задача периодически проверять подключение к интернет. Я бы не хотел использовать многопоточную модель и в моей программе алгоритмы в основном работают в синхронном режиме.

Не завидую я вашим пользователям, ибо не заботитесь вы о них нисколько...

I> Пока писал я подумал о том, что неплохо бы , чтобы в интернете был какой-нибудь хост с неизменным IP и который бы отвечал всегда на пинг или имел всегда открытый 80 порт.

Таких серверов порядка нескольких миллионов — выбирайте любой...
[КУ] оккупировала армия.
Re: Проверка подключения к интернет в синхронном режиме
От: Jolly Roger  
Дата: 20.12.09 04:09
Оценка: +1
Здравствуйте, islvap, Вы писали:

I> Всем привет, возник вопрос по проверке подключения к интернет, ребята посоветуйте пожалуйста как лучше, буду очень благодарен!


Знаете, мне это напомнило историю про X, Y и Z

Видите-ли, чтобы получить правильный ответ, зачастую — от самого себя, нужно прежде всего правильно сформулировать вопрос У Вас же, на мой взгляд, присутствуют минимум две ошибки именно в самом вопросе.

Во-первых,

I> В моей программе(winforms net 2.0) стоит задача периодически проверять подключение к интернет.


Простите, не верю Проверка наличия подключения сама по себе довольно-таки бессмысленна. Наверняка у Вас стоит совсем другая задача. Скорее всего Вы считаете, что проверив наличие "подключения к интернет", Вы решите свою задачу. Но это совсем ещё не факт. Более того, скорее всего это вообще не имеет отношения к Вашей задаче, и причиной тому — ошибка номер два.

проверять подключение к интернет

— а что такое "подключение к интернет"? Или даже так — что такое "интернет", к которому якобы можно подключиться и, соответственно, проверять наличие такого подключения? Ну ладно, не будем буквоедствовать, но всё равно, что Вам даст возможность подключиться к какому-нибудь серверу в Австралии, о котором Вы ничего не знаете?

И пожалуйста, не торопитесь обижаться, сначала всё таки постарайтесь обдумать сказанное
"Нормальные герои всегда идут в обход!"
Re[2]: Проверка подключения к интернет в синхронном режиме
От: islvap  
Дата: 20.12.09 10:30
Оценка:
K>Таких серверов порядка нескольких миллионов — выбирайте любой...

я выбрал например rsdn.ru , microsoft.com вы уверены, что ближайшие два-три года у них будет неизменный IP и они будут отвечать на пинг и доступны 24 часа в сутки?
Re[2]: Проверка подключения к интернет в синхронном режиме
От: islvap  
Дата: 20.12.09 10:48
Оценка:
Спасибо большое за ответ. Я специально, чтобы не раздувать первое сообщение не приводил ТЗ и не обосновывал почему я выбрал тот или иной способ реализации.
Задача в общем стоит так: у компании есть договор о предоставлении беспроводного доступа в интернет с несколькими крупными операторами связи. Менеджеры компании пока в офисах, на своих ноутбуках работают с интернет через внутреннюю сеть, а когда ездят где-то по объектам, компьютер должен сам искать способы выхода в интрнет и сигнализировать об этом пользователям. У программы нет никакого интрфейса, только значок в трее с логотипом компании зеленого или красного цвета. Программа периодически проверяет наличие интернет, и если интернет недоступен, программа ищет беспроводные сети операторов связи и подключается через них к интернет, избавляя пользователя от рутинной работы; если подключение установить удалось, то значок становится зеленым, если подключение пропало и доступных сетей нет, то красным. Медеджер может использовать интернет как угодно, может на мейл.ру зайти, или на сайт компании, хз. может порнуху посмотреть. В качестве тестового хоста, доступность которого определяет наличие интернет я выбрал компьютер с сайтом компании.
Re[3]: Проверка подключения к интернет в синхронном режиме
От: Jolly Roger  
Дата: 20.12.09 14:28
Оценка:
Здравствуйте, islvap, Вы писали:

Ну вот видите, оказывается, весь интернет Вам не нужен, а то я уж ипугался — весь выкачаете, мне не достанется К сожаления. мне с подобного рода задачами сталкиваться не приходилось, но думаю, что Вам нужно не связь проверять, а наличие соединения с провайдером. Вероятно для каждого провайдера создаётся отдельное соединение, и они доступны через RAS API, попробуйте посмотреть в этом направлении. Там, к примеру, есть функция RasGetConnectStatus. При этом совершенно не стоит бояться дополнительного потока. Этот поток может работать совершенно независимо от основного, и просто выстывлять-сбрасывать глобальный флаг. А основной поток может периодически смотреть состояние этого флага и состояние самого доп. потока.
"Нормальные герои всегда идут в обход!"
Re[4]: Проверка подключения к интернет в синхронном режиме
От: islvap  
Дата: 20.12.09 16:17
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, islvap, Вы писали:


JR>Ну вот видите, оказывается, весь интернет Вам не нужен, а то я уж ипугался — весь выкачаете, мне не достанется К сожаления. мне с подобного рода задачами сталкиваться не приходилось, но думаю, что Вам нужно не связь проверять, а наличие соединения с провайдером. Вероятно для каждого провайдера создаётся отдельное соединение, и они доступны через RAS API, попробуйте посмотреть в этом направлении. Там, к примеру, есть функция RasGetConnectStatus. При этом совершенно не стоит бояться дополнительного потока. Этот поток может работать совершенно независимо от основного, и просто выстывлять-сбрасывать глобальный флаг. А основной поток может периодически смотреть состояние этого флага и состояние самого доп. потока.


нет, все реализовано и работает. У меня сомнения в надежности того фрагмента кода, который я привел, о чём я и спросил собственно.
Re[3]: Велосипедисты?
От: akasoft Россия  
Дата: 21.12.09 10:10
Оценка:
Здравствуйте, islvap, Вы писали:

I>Задача в общем стоит так: у компании есть договор о предоставлении беспроводного доступа в интернет с несколькими крупными операторами связи. Менеджеры компании пока в офисах, на своих ноутбуках работают с интернет через внутреннюю сеть, а когда ездят где-то по объектам, компьютер должен сам искать способы выхода в интрнет и сигнализировать об этом пользователям.


Я может чего-то не понимаю, но стандартный менеджер беспроводной связи Windows так себя и ведёт. Периодически щупает точки и если настроен профиль автовхода, то выполняет подключение. Значки стандартные. Рутины там нет, один раз настроил параметры и пароли, и забыл.

(Вопрос скорее для форума setup/tools.)
... << RSDN@Home 1.2.0 alpha 4 rev. 1317>> SQLE 2005
Re[4]: Велосипедисты?
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.12.09 11:42
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Я может чего-то не понимаю, но стандартный менеджер беспроводной связи Windows так себя и ведёт. Периодически щупает точки и если настроен профиль автовхода, то выполняет подключение. Значки стандартные. Рутины там нет, один раз настроил параметры и пароли, и забыл.

Более того — он еще и для всех коннектов (LAN, Modem, Wifi) умеет каким-то образом отличать "internet connectivity" от "intranet connectivity". Это в семёрке. Я пока так и не понял, как он это делает.
Но вот с моим homenet-провайдером, который требует запуска специальной софтины для "разблокирования большого интернета" семёрка практически не ошибается. Иногда только тупит некоторое время.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Велосипедисты?
От: akasoft Россия  
Дата: 21.12.09 12:06
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Более того — он еще и для всех коннектов (LAN, Modem, Wifi) умеет каким-то образом отличать "internet connectivity" от "intranet connectivity". Это в семёрке. Я пока так и не понял, как он это делает.


Думаю, обращается на windows update или ещё к каким внутренним серверам. Если отзываются, то типа интернет. Точнее может сказать tcpview. Или посмотреть на сервере, куда NAT переводит пакеты.
... << RSDN@Home 1.2.0 alpha 4 rev. 1317>> SQLE 2005
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.