- •2.Опорная модель osi
- •2 Обзор программных средств
- •2.1 Аутентификация и авторизация. Система Kerberos
- •2.2 Установка и настройка протоколов сети
- •4 Классификация архитектур информационных приложений
- •2.1. Файл-серверные приложения
- •2.2. Клиент-серверные приложения
- •2.3. Intranet-приложения
- •2.4. Склады данных (DataWarehousing) и системы оперативной аналитической обработки данных
- •2.5. Интегрированные распределенные приложения
- •5 Файл-серверные приложения
- •3.1. Традиционные средства и методологии разработки файл-серверных приложений
- •3.1.1. Системы программирования и библиотеки
- •3.1.2. Средства и методы разработки приложений на основе субд на персональных компьютерах
- •3.2. Новые средства разработки файл-серверных приложений
- •3.2.1. Общая характеристика современных средств
- •3.2.2. Примеры новых подходов
- •3.2.2.1. Пакет ms Access
- •3.2.2.2. Система Visual FoxPro
- •3.2.2.3. Среда программирования ca-Visual Objects
- •3.3. Перенос файл-серверных приложений в среду клиент-сервер
- •3.3.1. Библиотеки доступа к базам данных
- •3.3.2. Протокол odbc и его реализации
- •3.3.3. Укрупнение приложений (Upsigsing)
- •3.4. Рекомендации по использованию инструментальных средств разработки файл-серверных приложений
- •6 Клиент-серверные приложения
- •7 Принципы работы архитектуры клиент-сервер
- •Частично децентрализованные (гибридные) сети
- •Пиринговая файлообменная сеть
- •Пиринговые сети распределённых вычислений
- •Пиринговые финансовые сети
- •Сети клиент/сервер
- •10 Intranet приложения
- •Intranet - корпоративная , но не публичная сеть
- •Intranet - это применение Web-технологии
- •Intranet - это архитектура клиент-сервер
- •Intranet - не панацея от всех бед
- •11 Организация адресации в интернете
- •4. Практическая часть.
- •Основы сокетов
- •Системные вызовы
- •Создание и уничтожение сокетов
- •Вызов connect
- •Отправка данных
- •Серверы
- •Локальные сокеты
- •Пример использования локальных сокетов
- •Internet-Domain сокеты
- •Пары сокетов
- •Основные конструкции языка Java
- •Библиотека классов языка Java
- •Общие сравнительные характеристики:
- •Вызов расширения isapi сервером www
- •Функция GetExtensionVersion
- •Функция HttpExtensionProc
- •Получение данных расширением isapi
- •Функция GetServerVariable
- •Функция ReadClient
- •Посылка данных расширением isapi
- •Функция WriteCilent
- •Функция ServerSupportFunction
- •Способы поиска в Интернете Три способа поиска в Интернете
- •Поисковые серверы
- •Язык запросов поисковой системы
- •Классификация вторжений
- •Физическая безопасность
- •Утилизация старых компьютеров
- •Программный доступ
- •Идентификация пользователей
- •Системные демоны и службы
- •Службы tcp/ip, которые иногда можно отключить
- •Образец политики корпоративной безопасности
Функция ReadClient
Прототип функции ReadClient находится в определении структуры EXTENSION_CONTROL_BLOCK и выглядит следующим образом:
BOOL (WINAPI * ReadClient) (HCONN ConnID,
LPVOID lpvBuffer, LPDWORD lpdwSize);
Через параметр hConn этой функции надо передать идентификатор канала, полученный через поле ConnID структуры EXTENSION_CONTROL_BLOCK.
Функция ReadClient читает данные в буфер, адрес которого передается через параметр lpvBuffer, а размер - через параметр lpdwSize. В случае успеха функция возвращает значение TRUE, а при ошибке - значение FALSE. Код ошибки можно получить при помощи функции GetLastError.
Работа с функцией ReadClient имеет некоторые особенности.
Когда расширение ISAPI получает управление, через структуру типа EXTENSION_CONTROL_BLOCK передается адрес предварительно прочитанного блока данных, полученного от удаленного пользователя. Как вы знаете, адрес и размер этого блока данных указаны, соответственно, в полях lpbData и cbAvailable структуры EXTENSION_CONTROL_BLOCK.
Однако размер предварительно прочитанных данных не может превышать 48 Кбайт. Если все данные не поместились в буфер предварительного чтения, их необходимо дочитать функцией ReadClient. При этом следует использовать следующий алгоритм.
Прежде всего следует сравнить размер предварительно считанных данных с полным размером данных, которые нужно считать (этот размер передается в поле cbTotalBytes структуры EXTENSION_CONTROL_BLOCK).
Если все данные уже были считаны предварительно, функцию ReadClient вызывать не нужно. В том случае, когда значение, передаваемое через поле cbTotalBytes, превышает значение cbAvailable, вы должны воспользоваться функцией ReadClient для того чтобы прочесть (cbTotalBytes - cbAvailable) байт данных от пользователя.
Заметим, что функция ReadClient не будет читать заново данные, предварительно прочитанные в буфер lpbData. Она прочитает только оставшиеся данные, причем не исключено, что для чтения оставшихся данных эту функцию придется вызывать в цикле несколько раз. Причина этого заключается в том, что функция ReadClient не обязательно сможет прочитать все оставшиеся данные за один прием.
После успешного завершения чтения функция ReadClient записывает размер прочитанного блока данных в переменную, адрес которой передается через параметр lpdwSize. Если при первом вызове значение этого размера меньше величины (cbTotalBytes - cbAvailable), вы должны вызвать функцию ReadClient еще один или несколько раз для чтения оставшихся данных.
Пример использования функции ReadClient вы найдете в разделе “Приложение FILEUPL”. Там мы привели исходные тексты расширения ISAPI, позволяющее использовать сервер WWW довольно необычным способом - для получения файлов от удаленных пользователей и записи их на диск сервера. Так как размеры передаваемых файлов могут быть значительны, приложение FILEUPL вызывает функцию ReadClient в цикле.
Посылка данных расширением isapi
Вместо того чтобы записывать выходные данные в стандартный поток вывода STDOUT, как это делает программа CGI, расширение ISAPI пользуется для посылки данных функциями WriteCilent и ServerSupportFunction, указатели на которые передаются расширению ISAPI через структуру типа EXTENSION_CONTROL_BLOCK.