Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #71, НОЯБРЬ 2004 г.

Live Update в X-стиле

[RU].Ban0K! (www.int3.net)

Хакер, номер #071, стр. 071-106-1


Куем модуль для реализации автообновлений

Надеюсь, уже много программ ты сваял, основываясь на статьях из «Кодинга» :). Много программ – это хорошо, но вот что делать, если они устаревают? Естественно, обновлять, и модуль самообновления нынче присутствует в любой уважающей себя программе. Модуль – это клиентская и серверная часть, и эта статья будет немного нетипичной, поскольку в ней мы расскажем и про серверную часть на PHP, и про клиентскую на Delphi. Раздел «PHP» и Никитос лично от этого не пострадают :).

Принцип работы сервера

Итак, серверная часть. Это чудо представляет собой небольшой скрипт на PHP. Как известно, на PHP можно писать движки для форумов, порталов, интернет-магазинов и тому подобную ерунду. Я же использую его возможности для несколько иной задачи, нежели просмотр динамических web-страниц.

Принцип действия прост: клиентская часть запрашивает страницу http://localhost/?q=тип_запроса (далее будем называть это действие посланием запроса), и в зависимости от типа запроса скрипт выдает обычным echo ответ. Так организуется связь клиент - сервер.

Для красоты примера мы должны отвечать на запросы, которые подает именно наша клиентская программа, т.е. если запрос, к примеру, будет подан из IE, мы должны просто переправить его на главную страницу сайта. Это будет являться, в некотором роде, хорошим тоном нашего скрипта. Реализуем мы это с помощью $HTTP_SERVER_VARS["HTTP_USER_AGENT"].

Пришло время определиться с типами запроса. Для простоты будем обрабатывать всего три:

1. GetVersion. На этот запрос следует отослать клиенту строку с последней версией продукта. Требуется для того, чтобы клиент не качал каждый день одну и ту же версию :).

2. GetFileSize. Необходим, чтобы клиент заранее создал пустой буфер нужной для получаемого файла длины. Ему пересылается длина файла.

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

Общую структуру скрипта можно видеть на листинге 1. Довольно легкая, кстати, структура :). В файле data.php уже содержатся две переменные, это $_version и $_link. Они изменяются посредством администраторской части. На запрос о версии мы просто выводим переменную $_version. Обработка запроса о размере файла происходит также тривиально:

echo FileSize($_link);

Необходимо сказать, что $_link должен указывать на файл, который находится на данном сервере под влиянием php, иначе функция FileSize вернет ноль. При получении запроса на скачивание необходимо будет прочитать файл и вывести его на стандартный выход, как будто это обычный HTML (обработки ошибок я не вставлял, но в исходнике на диске они присутствуют в полном объеме). Разберем код, обслуживающий этот запрос.

//Открываем файл для бинарного чтения

$BinaryFile = fopen($_link,"rb");

//Читаем

$Buffer = fread($BinaryFile,FileSize($_link));

//Закрываем файл

fclose($BinaryFile);

//Выводим на стандартный выход

echo $Buffer;

Разборки с Internet API

Надо сказать, что благодаря семейству функций библиотеки WININET.DLL кодинг клиентской части обещает быть легким и приятным :). Несмотря на то, что в статье «Delphi для качков» Dr.Klouniz уже касался этой темы, сейчас мы разберем их использование в контексте нашего конкретного случая. Да и просто повторение не повредит, тем более что и статья та вышла в свет больше полутора лет назад.

Содержание  Вперед на стр. 071-106-2
<<< НАЗАД ||| ГЛАВНАЯ