Проверка подключения к интернет в синхронном режиме
От: 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 порт. Тогда мне кажется моя задача упростилась и мне нужно было бы разрешать имя в асинхронном режиме. Такое возможно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.