Delphi: Контроль соединений c Internet

Причиной побудившей меня написать эту статью была нестабильность работы соединения с Интернетом, которое довольно часто разрывалось. А стандартная функция ОС Windows ХР не справлялась с возложенной на нее обязанностью по восстановлению разорванного соединения. Плюс к этому, не так уж удобно «листать» системный журнал в поиске причины разрыва, или времени разрыва, или других каких логов.(Стоит только вспомнить эти ужасные времена, когда у «стрима» было аж по 4 обрыва. Сколько нерв попортили они людям) … прошу прощения, отвлекся ;) Приступим к решению этого вопроса. В качестве язык программирования будем использовать Delphi 7 версии.

Первое что нам надо рассмотреть, это средства для работы с системой установки удаленного доступа (RAS). Данное средство представляет собой набор API-функций, которые хранятся в системной библиотеке rasapi.dll, используемой ОС.

Это достаточно мощная библиотека, и для решения нашей проблемы нам понадобятся не все функции. Поэтому мы рассмотрим только необходимые нам. Перечислю их:

RasEnumConnections – функция для проверки наличия установленных соединений;
RasEnumEntries – функция получения списка соединений(зарегистрированных) в системе;
RasDial – функция установки соединения.
Что ж, теперь необходимо сформулировать тех. задание решения поставленной задачи. И так:

Необходимо определить/получить список соединений (зарегистрированных в системе)
Реализовать процедуру дозвона
Реализовать обработчик-таймер, который будет проверять, через определенный интервал времени, статус установленного соединения
Написать процедуру ведения лога – пользовательский журнал.
Кроме того, чтобы программы была более гибкой, то мы реализуем дружественный интерфейс, в котором позволим пользователю выбирать из списка соединений (которых может быть более одного ;) ). Поэтому начнем мы с последнего.

Для этого запустим Delphi, создадим новый проект и сохраним его под названием, к примеру ControlConn. Скинем на форму:

2 ListBox’a;
3 кнопки;
1 поле ввода для указания интервала проверки статуса соединения.
Теперь проведем некоторое приготовление. Один ListBox назовем ActivCon – в него будут занесены сведения о существующих соединениях, а второй назовем ControlCon – в нем будут находится соединения которые необходимо контролировать. Одна из кнопок будет отвечать за запуск процесса контроля – и будет иметь не двусмысленное имя start, оставшиеся 2-е кнопки необходимы для манипулирования содержимым ListBox’ов, добавить в список контролируемых соединений и удалить из списка. Поле ввода назовем interval.

Создадим для формы событие OnActivate, на вкладке Event в инспекторе объектов. В нем мы опишем код, который будет получать список соединений. Кстати, замечу, для тех кто только начинает и тех кто этого не знал, но программирует уже давно, что хорошим стилем программирования является описание всех своих функций и процедур, используемых в проекте, в отдельном модуле. В данном случае у нас нет необходимости выносить код в отдельную функцию. Но стоит иметь в виду, что в этом есть два основных плюса:

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

А теперь код:

Теперь при запуске программы у нас в списке ActivCon будут перечисленный все зарегистрированные в системе ras-соединения. Далее нужно добавить возможность манипулирования списком соединений. Следующий код для кнопки «Добавить»:

Для кнопки «Удалить»:

В обоих листингах используется функция search, которой в качестве параметра передается строка, наличие которой необходимо проверить в списке соединений:

Да, кстати, самое главное то мы забыли. Нам еще нужен таймер, добавим его. Кроме того нам необходимо объявить глобальные переменные и структуру состояния соединения, объявим их:

Кроме глобальных переменных, нам нужно определить CallBack-процедуру, которая не обходима для вызова функции RasDial().

Теперь создадим для Таймера событие onTimer и напишем в нем следующий код:

Теперь опишем процедуру установки соединения:

На этом все. Статью заканчивал в спешке, поэтому в случае обнаружения каких либо не точностей, не поняток или ошибок просьба сильно не ругаться, а отписываться по всем замечания и не только ;). Всем спасибо!

Понравилась статья? Поделиться с друзьями:
Комментариев: 8
  1. pomashok

    Здорово! Интересно! Меня эта проблема тоже мучает давно (нестабильность работы соединения с интернетом).
    Было бы неплохо добавить информацию по расшариванию подключения (для случая когда машинка является «сервером») и ссылку на исходник (в котором будет уже RasUnit.pas) :

    1. admin (автор)

      Отличное предложение! ;) Сегодня же займусь этим вопросом…

  2. pomashok

    а исходник проги есть? Что-то не получается повторить код (ругается) :(

    1. admin (автор)

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

  3. pomashok

    Обязательно зарегистрируюсь! Сейчас катастрафически не хватает времени.
    Исходники и статья совершенно разные!

    1. admin (автор)

      Да, есть такое дело. В статье просто используется старая версия, но замечу рабочая. А то что выложено в «Наши проекты», на то что дал тебе ссылку уже более отточены, но увы требуют доработки и расширения. Поэтому и отличаются. Не вижу смысла редактировать статью ибо в ней хоть и старая версия, но смысл тот же. В целом то ничего не изменилось ;)

  4. pomashok

    Я к тому, что статья и ссылка на исходники должны быть идентичны.
    Чтоб кто прочитал статью мог воспользоваться исходником. Оттачивать проги будут своих приложений… :)

    1. samsim

      Контроль не так часто нужен, как безопасность самого соединения. Контролировать можно только то, что требует такого контроля. Статья хорошая, иногда может понадобится.

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: