Это и есть та самая кнопка, которая производит выбор. <INPUT TYPE=submit VALUE=" Ввод данных "> Эта команда отображается следующим образом:
Кнопка выполняет инициализацию начальными значениями всех полей. <INPUT TYPE=reset VALUE="Очистить поля"> Эта команда отображается следующим образом:
3. Выполнение программы(CGI-сценария) можно условно разделить на пять этапов.
1. Запуск программы.
2. Инициализация и чтение выходных данных.
3. Обработка данных.
4. Вывод результатов выполнения.
5. Завершение программы.
Различия между CGI-сценарием и консольным приложением касаются первого, второго и четвертого этапов выполнения.
В подавляющем большинстве случаев запуск CGI-сценария осуществляется щелчком на кнопке Submit Query, сформированной с помощью дескриптора <INPUT TYPE="SUBMIT">, который находится на HTML-странице между <FORM> и </FORM>. Значением атрибута ACTION дескриптора <FORM> является URL файла, содержащего код CGI-сценария. Так, приведенное ниже выражение означает, что файл с кодом CGI-сценария находится на сервере www.geo.sci.com в каталоге cgi-bin в файле script.pl.
Web-сервер различает, что надо сделать с файлом, на который указывает URL, — передать его содержимое клиенту или запустить файл на выполнение следующим образом:
1. При установке Web-сервера один из каталогов специально выделяется для хранения сценариев. Обычно такой каталог получает имя cgi-bin. В этом случае, если клиент запрашивает файл из каталога cgi-bin, сервер воспринимает такой запрос как команду на запуск сценария. Файлы из других каталогов интерпретируются как HTML-документы.
2. Используется расширение файла. При настройке сервера указывается, что файлы с определенными расширениями содержат коды сценариев. В системе UNIX понятие расширения отсутствует, поэтому для идентификации CGI-сценария служат символы, следующие за последней точкой в имени файла.
Идентификация по расширению используется относительно редко. Чаще всего все сценарии помещаются в /cgi-bin, /scripts или в другой каталог, специально выделенный для их хранения.
4. Для вывода результатов выполнения CGI-сценария (шаг 3 рис.1) достаточно вывести их в стандартный выходной поток. Однако, разрабатывая CGI-сценарий, не забывайте о том, что он все же отличается от консольной программы и имеет следующие особенности.
1. Информация, передаваемая клиенту, должна соответствовать протоколу HTTP, т.е. состоять из заголовка и тела ответа. Как правило, получив данные от сценария, сервер самостоятельно добавляет первую строку заголовка.
НТТР/1.0 200 ОК
Формирование информационных полей, входящих в состав заголовка, — задача сценария. Чтобы данные, переданные сценарием, были правильно интерпретированы клиентом, необходимо, чтобы в заголовке присутствовало как минимум поле Content-type. За заголовком должна следовать пустая строка. При отсутствии полей заголовка реакция броузера будет непредсказуемой. В подобных случаях броузер обычно пытается отобразить полученную информацию как текстовый файл.
2.. Самый естественный формат для броузера — формат HTML. Результаты работы сценария обычно оформляются в виде Web-страницы, т.е. возвращаемые данные следует дополнить дескрипторами HTML. Таким образом, ответ CGI-сценария клиенту обычно выглядит так:
Content-type: text/html
<HTML>
<НЕАD><Т1ТLЕ>Ответ сценария</ТIТLЕ></НЕАD>
<BODY>
Обратите внимание на пустую строку после выражения Content-type: text/html. Она обязательно должна присутствовать в ответе, в противном случае клиент воспримет все последующие данные как продолжение заголовка.
5. Передача параметров
Если сценарий вызывается из формы, ему передаются те данные, которые пользователь ввел с помощью интерактивных элементов, отображаемых на Web-странице. Передача информации CGI-сценарию осуществляется в два этапа: сначала броузер передает данные Web-серверу (шаг 1, рис. 1), затем Web-сервер передает их сценарию (шаг 2)
Из имен элементов и их значений формируется строка параметров, которая имеет следующий формат,
Имя1=значение1&имя2=значение2...&имяn=значениеn
Каждый параметр представляет собой имя управляющею элемента и его значение, разделенные знаком равенства, а несколько таких пар объединяются н строку с помощью символа "&". Управляющие символы (“&”, …) кодируются последовательностью из знака процента ("%"), за которым следуют две шестнадцатеричных цифры, представляющие код символа. Так, например, последовательностью "%21" кодируется восклицательный знак ("!"), "%3C" — символ "<" и т.д. Как правило, при передаче параметров трехсимвольными последовательностями заменяются все знаки, кроме латинских букв, цифр и символа пробела (последний заменяется знаком "+").
Таким образом, перед использованием строки параметров ее надо декодировать. Алгоритм декодирования чрезвычайно прост и включает в себя следующие действия.
· Выделить из строки параметров пары имя=значение.
· Выделить из каждой пары имя и значение.
· В каждом имени и каждом значени заменить символы "+" пробелами.
· Каждую последовательность из символа "%" и двух шестнадцатеричных цифр преобразовать в ASCII-символ.
Атрибут METHOD дескриптора <FORM> имеет либо значение "GET", либо значение "POST". Значения "GET" и "POST" определяют два различных метода передачи параметров сценарию.
· Если атрибут METHOD имеет значение "GET", строка параметров передается вместе с URL вызываемого сценария. Разделителем между URL и строкой параметров является символ "?".
· Если атрибут METHOD имеет значение "POST", строка параметров передается в теле HTTP-запроса.
6. Анализ строки параметров (шаг 2, рис.1)
Если атрибут METHOD дескриптора <FORM> имел значение "GET", строка параметров передается серверу в качестве значения переменной окружения QUERY_STRING.
Для языка С для получения указателя на строку параметров надо использовать функцию getenv().
s = getenv("QUERY_STRING");
При использовании метода POST данные доставляются сценарию по-другому. Они передаются через стандартный поток ввода (STDIN). Чтобы сценарий мог определить, сколько символов следует читать из стандартного ввода, Web-сервер устанавливает значение переменной окружения CONTENT_LENGTH равным длине строки параметров.
Получив управление, сценарий в первую очередь должен выяснить, с помощью какого метода выполнялась передача параметров. Эта информация содержится в переменной окружения REQUEST_METHOD.
Итак, в простейшем случае, чтобы выполнить обработку строки параметров, достаточно знать назначение трех переменных окружения: REQUEST_METHOD, QUERY_STRING и CONTENT_LENGTH.
Пример 1. Программа на языке С, которая возвращает клиенту приветствие:
#include <stdio.h>
int main() { printf("Content-Type: text/html\n\n"); printf("<h1>Приветствие!</h1>\n"); }
Пример 2. Программа на языке С, которая возвращает клиенту значения переменных окружения ОС (метод “GET”).
Пример 3. Программа на языке С, которая читает данные из стандартного входного потока (метод “POST”).
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
int main()
{
char *s=getenv("REQUEST_METHOD");
char *endptr;
unsigned int contentlength;
char buff[10000];
const char *len1 = getenv("CONTENT_LENGTH");
if(s!=NULL)
{
if(strcmp(s,"GET")==0)
{
strcpy(buff,getenv("QUERY_STRING"));
}else
if(strcmp(s,"POST")==0)
{
contentlength=strtol(len1, &endptr, 10);
fread(buff, contentlength, 1, stdin);
}
.
.
.
Обработка Buff и возвращение результатов клиенту
.
.
.
}
return 0;
}
Большинство периферийных устройств подключаются через промежуточные периферийные интерфейсы, находящиеся на нижних уровнях иерархии подключений (на верхнем уровне — системная шина). Периферийные интерфейсы — самые разнообразные из всех аппаратных интерфейсов. К периферии, подключаемой через промежуточные интерфейсы, относятся большинство устройств хранения (дисковые, ленточные), устройств ввода-вывода (дисплеи, клавиатуры, мыши, принтеры, плоттеры), ряд коммуникационных устройств (внешние модемы). По назначению периферийные интерфейсы можно разделить на специализированные и универсальные, выделенные и разделяемые:
* Специализированные интерфейсы ориентированы на подключение устройств определенного узкого класса, и в них используются сугубо специфические протоколы передачи информации. Примеры — популярнейший интерфейс мониторов VGA, интерфейс накопителя на гибких дисках, традиционные интерфейсы клавиатуры и мыши, IDE/ATA и ряд других.
* Универсальные интерфейсы имеют более широкое назначение, их протоколы обеспечивают доставку данных, не привязываясь к специфике передаваемой информации. Примеры — коммуникационные порты (СОМ), интерфейс SCSI, шины USB и FireWire.
* Выделенные интерфейсы позволяют подключить к одному порту (точке подключения) адаптера (контроллера) лишь одно устройство; число подключаемых устройств ограничено числом портов. Примеры — СОМ-порт, интерфейс VGA-монитора, порт AGP, интерфейс Serial SCSI.
* Разделяемые интерфейсы позволяют подключить к одному порту адаптера множество устройств. Варианты физического подключения разнообразны:
шина (жесткая, как ISA или PCI; кабельная шина SCSI и IDE/ATA), цепочка (daisy chain) устройств (SCSI, IEEE 1284.3), логическая шина на хабах (USB) или встроенных повторителях (IEEE 1394 FireWire).