Blog. Just Blog

Определение состояния подключения к сети на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Определение состояния подключения к сети на Ассемблере
Определение состояния подключения к сети на Ассемблере

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

Первый способ основан на получении количества подключений к удаленному серверу с помощью функции RasEnumConnections. Этот способ работает только с модемным подключением, которое в наше время безнадежно устарело и почти нигде не встречается. При подключении через беспроводную или локальную сеть результат функции всегда будет неправильным. Этот способ можно использовать только для того, чтобы определить факт модемного соединения, но не для определения состояния подключения к сети.
  1.         ; Проверка подключения через RasEnumConnections
  2.         mov     [tmp],0
  3.         mov     [tmp2],0
  4.         invoke  RasEnumConnections,NULL,tmp,tmp2
  5.         cmp     [tmp2],0
  6.         je      no_internet_connection
Второй способ - использование функции InetIsOffline. В теории она должна возвращать TRUE, если в данный момент система не подключена к интернету, и FALSE, если есть соединение или с момента запуска еще не было ни одной попытки это соединение установить. Но это в теории. На практике функция всегда возвращает FALSE, даже если вообще никаких подключений нет. Использовать категорически не рекомендуется.
  1.         ; Проверка подключения через InetIsOffline
  2.         invoke  InetIsOffline,NULL
  3.         cmp     eax,TRUE
  4.         je      no_internet_connection
Третий способ - проверка доступности определенного адреса в сети посредством функции InternetCheckConnection. Очень хороший и надежный способ, тут главное использовать для проверки какой-нибудь надежный адрес, который всегда доступен. Минус этого способа заключается в том, что такие обращения к удаленному ресурсу перехватываются фаерволом и могут быть заблокированы. Ну и гарантировать стопроцентную доступность не может ни один, даже самый надежный сайт.
  1. szUrl   db 'https://yandex.ru',0
  2.         ...
  3.         ...
  4.         ; Проверка подключения через InternetCheckConnection
  5.         FLAG_ICC_FORCE_CONNECTION = 1
  6.         invoke  InternetCheckConnection,szUrl,FLAG_ICC_FORCE_CONNECTION,NULL
  7.         cmp     eax,FALSE
  8.         je      no_internet_connection
Самый правильный способ, чтобы определить состояния подключения к сети, это использование функции InternetGetConnectedState. Ее результат не зависит от прав доступа конкретного приложения, поэтому в совокупности с предыдущей функцией ее можно использовать для определения ситуаций, когда соединение с интернетом есть, но при этом ваше приложение заблокировано на фаерволе. Также по возвращаемому значению можно определить тип соединения, в связи с чем первый способ полностью теряет актуальность.
  1.         ; Проверка подключения через InternetGetConnectedState
  2.         invoke  InternetGetConnectedState,tmp,NULL
  3.         cmp     eax,FALSE
  4.         je      no_internet_connection
Еще один неплохой способ - функция IsNetworkAlive, доступная, начиная с Windows XP.
  1.         ; Проверка подключения через IsNetworkAlive
  2.         invoke  IsNetworkAlive,tmp
  3.         cmp     [tmp],0
  4.         je      no_internet_connection
В приложении пример программы с исходным текстом, которая проверяет состояние подключения к сети всеми описанными в статье способами.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Check.Internet.Connection.Demo.zip (1,784 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 1109 | Комментариев: 4

Метки: Assembler, сеть
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
dirbeer (05.08.2019 в 13:28):
NoNaMe, Delphi?
Андрей (03.07.2019 в 00:05):
Воу-воу, диалап на картинке!
ManHunter (13.05.2019 в 15:08):
NoNaMe, не совсем так. Эта функция определяет вообще ВОЗМОЖНОСТЬ подключения компа к сети, то есть наличие сетевой карты, модема, адаптера wifi и всякого подобного железа. Во всех этих случаях результат всегда будет положительный. А вот подключен комп через эти устройства к интернету или нет - это не узнать. Так что увы, не годится.

Добавил еще один способ с IsNetworkAlive.
NoNaMe (13.05.2019 в 14:51):
function IsInternetConnected: Boolean;
begin
   Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0045 сек.) / Память: 5 Mb
Наверх