Як визначити чи підключено комп'ютер до інтернету

Останнім часом із завидною постояннством постає питання "Як визначити, підключений комп'ютер до інтернет чи ні?". Дозволимо собі поміркувати на цю тему і пояснити деякі з принципів мережевих взаємодій.

Багато з вас спостерігали наступну ситуацію: на комп'ютері під керуванням MS Windows варто мережева карта. Припустимо, що неправильно налаштований драйвер карти або комп'ютер фізично не підключений до мережі. При завантаженні, система не видасть ніяких помилок. Тільки після того, як ви намагаєтеся, наприклад, увійти в Мережеве оточення, з'явиться повідомлення про недоступність мережі.

по-перше, з точки зору системи (мається на увазі програмна її частина) не можна визначити, чи можлива в даний момент передача даних (тобто чи є то горезвісне "підключення до мережі") без самої передачі;

по-друге, виходячи з вищесказаного, питання слід привести до вигляду: "доступний якийсь вузол або сервіс мережі?" (Тобто чи можлива фактична передача даних?)

Відповіддю на нього і займемося.

Для початку розвіємо переконання тих, хто думає, що відповісти на це питання можна використавши такі методи і функції:

Щоб упевнитися в марності цієї функції для наших цілей, досить подивитися її опис в MSDN:

"You can not rely solely on the fact that InternetGetConnectedState returning TRUE means that you have a valid active Internet connection. It is impossible for InternetGetConnectedState to determine if the entire connection to the Internet is functioning without sending a request to a server. This is why you need to send a request to determine if you are really connected or not. You can be assured however that if InternetGetConnectedState returns TRUE, that attempting your connection will NOT cause you to be prompted to connect to the default Internet Service Provider. "

"Ви не можете покладатися тільки на той факт, що якщо ф-ція InternetGetConnectedState повертає TRUE, це означає наявність активного підключення до мережі Інтернет. InternetGetConnectedState не може визначити, чи функціонує з'єднання з Інтернет без звернення до сервера."

Єдино корисним в цій функції є те, що якщо вже вона і повернула TRUE, то при спробі підключення до мережі Інтернет вам не буде пропонуватися спочатку підключитися до нього.

Функція GetHostByName () - дозвіл імен хостів.

Результат, що повертається цією функцією, який свідчить - згідно MSDN - про успішне її завершення, каже лише про те, що в системі правильно налаштований і доступний сервіс DNS. Як правило, DNS-сервери розташовані або в локальній мережі провайдера, або в локальній мережі, до якої підключений наш комп'ютер (мережа організації, наприклад). Хоча, безсумнівно, сервера імен і є частиною того, що являє собою сьогодні Інтернет, і в тому і в іншому випадку успішне вирішення імені хоста скаже нам тільки про доступність DNS-сервера і не більше того.

Визначення активності якогось dialup-з'єднання з певним провайдером.

Головне в цьому випадку те, що dialup, в загальному, ніяк не пов'язаний з Інтернет. Це всього лише засіб для підключення нашої програмно-апаратної системи до віддалених програмно-апаратним системам, але не до мереж. Іншими словами - факт виявлення якогось активного в даний момент dialup-з'єднання говорить лише про те, що між двома територіально віддаленими одна від одної комп'ютерами встановлено зв'язок з використанням низькорівневих протоколів межмодемной зв'язку та одного з логічних протоколів віддаленого взаємодії (PPP, SLIP і деякі інші) . Це - просто один з можливих каналів зв'язку між двома комп'ютерами, який може бути використаний для будь-яких цілей, в тому числі і для взаємодії з вузлами Інтернет.

А тепер - правда.

З точки зору протоколу TCP / IP для вирішення поставленого завдання можна піти тільки двома правильними шляхами:

Використовувати протокол ICMP: утиліти ping, traceroute; (Відповідає на питання про доступність будь-якого вузла, але не говорить про доступність певного сервісу на цьому вузлі.). Ключові фунции - IcmpSendEcho () (реалізована в ICMP.DLL), InternetCheckConnection () (реалізована в WININET.DLL)

Спробувати підключитися до будь-якого Інтернет-сайту. або до необхідного нам або до найбільш ймовірно працює в даний момент (пошукові сервера, вузли великих компаній і т.п.), визначивши програмну реакцію на помилки при виклику функцій підключення (найнадійніший і достовірний спосіб перевірки як доступності вузлів, так і сервісів) . Ключова фунция - Connect () (реалізована в WS2_32.DLL)

Приклад використання ICMP за допомогою ICMP API (1-й шлях) описаний у відповідній статті.

Для реалізації 2-го шляху цілком підійдуть готові компоненти зі стандартних палітр Делфі Internet, FastNet (TClientSocket, TPowerSock), а також багато компонентів зі складу пакета Indy. Можна зробити те ж саме і реалізувавши власний алгоритм з використанням безпосередньо Winsock API-викликів.

В якості короткого резюме всього викладеного вище можна сказати наступне.

Інтернет, за визначенням, - глобальна мережа, мережа локальних мереж. "Підключення" до Інтернет, з цієї точки зору, є всього лише потенційна (причому зовсім не гарантована) можливість "спілкування" комп'ютера (вузла) однієї мережі з комп'ютером (вузлом) іншої мережі за встановленими для Інтернет-сервісу угодами з наданням такої можливості Інтернет -провайдер обох сторін. І якщо така можливість реалізувати в даний цікавить момент часу (цільовий комп'ютер / вузол "відповідає" на спроби connect'а або ping'а), можна стверджувати, з певною часткою ймовірності, що "комп'ютер підключений до Інтернет".

Схожі статті