Программирование >>  Руководство по созданию web приложений 

1 ... 106 107 108 [ 109 ] 110 111 112 ... 141


Глава/. CGI и ISAPI сервера Web

Если все данные уже считаны, функцию ReaclCllent вызывать не нужно. В том когда значение, передаваемое через поле cbTotalBytes, превышает значение mailable. Вы должны воспользоваться функцией ReadClient для того чтобы прочесть ciiTotalBytea-cbaaailaDle байт . от пользователя.

Заметим, что функция ReadClient не будет читать заново данные, записанные в буфер IptiData. Она займется оставшимися данными, причем не исключено, что для их прочтения эту функцию придется вызывать в несколько раз. Дело

в том, что функция ReadClient не всегда может прочитать все оставшиеся данные за один прием.

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

раметр . . . Если а первом вызове этот размер меньше величины cbTotal-а .. : Вы должны вызвать ReadClient еще один или не-

раз для чтения данных.

Отправка данных расширением ISAPI

того чтобы выходные данные в . . . . поток

как это делает программа CGI, расширение ISAPI пользуется для пересылки данных функц1юми и Указатели на эти фун-

кции передаются а .... ISAPI через структуру типа , - - :11Б10Н СС11Т-

Функция WriteClient

Прототип функции . .а взятый из определения структуры EXTEN-

: - . . приведен ниже:

BOOL ... * .. ..... С

LPVOID Buffer, DWORD .

Через параметр hConn функции WriteClient передается идентификатор канала, полученный через поле СоппШ структуры ~~\.

Функция WriteClient удаленному пользователю данные из буфе-

ра Buffer, гаааа размер передаваемого блока данных быть записан в

, . : типа DWORD, . . которой передается через параметр IpdwBytes. Параметр dwReserved зарезервирован для дальнейших расширений возможнос-

функции.

В случае успеха функция . TRUE, а при ошибке - значе-

ние EALSE. Код ошибки можно получить посредством функции QetLastErrar

что после данных функция WriteClient записывает в пе-

ременную, адрес которой был ей передан через параметр IpdwBytes, количество успешно . байт данных. В отличие от tjiyirKiiiiii ReadClient, функция

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

Функция SerttrSuppirlfuictioii

Прототип функции ServerSupportFunction, определенный в структуре типа

. приведен ниже:

BOOL (WINAPI .. - : hConn,

DTORD . LPVOID

LPDWORD IpdwSlze, LPDWORD



strcat(szBuff,

NULL. NULL.

Заметим, что функция ServerSupportFunction не позволяет посылать

двоичные данные. Для отправки двоичных данных Вы обязательно должны применить функцию WriteClient.

Через параметр rFuni - передается идентифи-

катор канала, : . через поле . структуры . :

Параметр :.. . позволит задать из нескольких кодов запроса,

определяющих операцию, выполняемую этой

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

Параметр IpdwDataType для указания дополнительной строки

заголовка или дополнительных данных, которые будут добавлены к заголовку, iifp.ivijiBaf,*! удаленному . Если для параметра IpdwDataType

указать значение NULL (что допустимо), к заголовку будут добавлены символы конца строки

Какие операциидопустимо припомощифункции8егуег8иррогГ-

Function?

Ниже мы привели список возможных значений параметра dwHSERRequest, определяющего код выполняемой операции. # !: :.

-Эта операцзю для пересылки удаленному пользователю стан-

дартного заголовка HTTP. Если надо добавить другие следует вос-

пользоваться параметром IpdwDataType. В качестве дополнительного заголовка Вы можете указать любую строку, закрытую символами конца строки и двоичным нулем.

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

: il\r\o\r\n

from ISAPI . ;



Глава 7. Расширения CG! и ISAPI сервера Web 321

Используя операцию И . . ; ; расширение ISAPI может послать

удаленному пользователю данные, хранящиеся по определенному адресу URL, как будто бы эти данные были . непосредственно пользова-

телем по этому адресу URL. Это удобно для отправки либо динамически созданных данных, либо предварительно подготовленных данных. Адрес URL должен быть указан в виде текстовой строки, а двоичным . . через а ; ... Ip.iyffer Размер строки задают в параметре IpdwSize. Что же касается параметра IpctoDataTypo, то apai выполнении данной операции этот параметр игнорируется.

I HSEREIlSEUO JBLEEDIBEuLRESP

Отправка сообщения с номером 302 (URL Redirect). Адрес URL указывается аналогично тому, как это делается npvi выполнении операции НЕЕ JEQ -

Преобразование логического адреса URL в физический. Адрес логического пути передается через параметр IpvBuffer. По этому же адресу записывается результат преобразования. Размер буфера при вызове функции задается, как обычно, с помощью параметра IpdwSize.

После выполнения преобразования в переменную типа DWORD, адрес которой указан параметром IpdwSize, будет записана длина строки результата преобразования.

♦ H8E RE§E0iEJiITPLSE8SI0N

В том случае, когда расширение ISAPI оставляет канал открытым для выпол-длительной обработки данных, этой командой сообщить серве-

ру о завершении обработки. Все параметры функции а : . г tPun .

при указании этой команды игнорируются.

Приложение ISHELLO

в качестве нашего первого расширения 1SAPI мы предлагаем приложение ISHELLO, выполняющее простейшие функции.

Вызов расширения isliello.dll выполняется из формы, исходный текст которой приведен в листинге 7-9.

Листинг 7-9 Вы найдете в файле cti7\ISHELLO\i8liello.html на прилагаемом к книге компакт-диске.

Расширение вызывается в параметре ACTION тега аналогично тому, как

это делается для программ CGI:

После вызова наше . . : динамически создает

. . на рис. 7-7.



1 ... 106 107 108 [ 109 ] 110 111 112 ... 141

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика