Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
0
Добавлен:
27.12.2019
Размер:
456.19 Кб
Скачать

36. Визначення потрібного сервера та жетон клієнта.

Архитектура клиент-сервер чаще всего предполагает, что клиент и сервер – это разные приложения, не имеющие никакой информации друг о друге. В QNX- 6 для организации обмена сообщениями сервер создает канал и блокируется в ожидании сообщения. Клиент в свою очередь, является инициатором обмена сообщениями. Для этого ему необходимо создать подключение с сервером, зная его nd|pid|chid(дескриптор узла, идентификатор процесса, идентификатор канала соответственно).

Самые распространенные способы для сервера сообщить, желающим подключиться клиентам, о своем местонахождении:

1. Открыть, известный клиенту, файл записать туда nd|pid|chid(самый распространенный в UNIX). Клиент читает из него все что надо. Этот подход относительно прост, но он имеет недостатки: загрязнение файловой системы, поскольку после сбоя в работе сервера файлы остаются, появляется необходимость в разработке механизмов удаления файлов при сбое сервера, необходимо разрабатывать механизмы обновления содержимого таких файлов.

2. Объявить nd|pid|chid как глобальные переменные, что допустимо для многопотоковых серверов, но не работает вне сервера.

3. Занять часть пространства имен и стать администратором ресурсов(является рекомендуемым общим решением). Сервер регистрирует некоторое имя пути как свою область ответственности, а клиенты обращаются к нему обычным вызовом функции open(имя_пути,...);

Создав подключение, клиент отправляет серверу сообщение MsgSend() и блокируется в ожидании ответа. Сервер в свою очередь, получив сообщение rcvid=MsgReceive(), разблокируется и начнет обработку полученного от клиента сообщения. После обработки сообщения сервер отвечает клиенту MsgReply(rcvid, ..), переводя его из состояния блокировки в состояние готовности. Переменной rcvid(идентификатор отправителя – целое число, его еще наз. жетон) осуществляется привязка приема сообщения от клиента к последующему ответу конкретному клиенту. В случае утери этого значения, и соответственно невозможности выполнить функцию MsgReply(), функция MsgSend() клиента не разблокируется, пока сервер работает или пока не настал тайм-аут соединения.

37. Обмін повідомленнями великого розміру.

По схеме:

Клиент отправляет сообщение MsgSend(); и блокируется. Сервер можетчитать данные из адресного пространства колиента MsgRead(…); или писать данные MsgWrite(…); А потом вызывает MsgReply() без данных для разблокировки. Ф-ции:

int MsgRead(int rcvid, void* msg, int nbytes, int offset);

rcvid – с кого читать

msg – куда читать в сервере

nbytes – количество байт

offset – смещение в клиентском буфере

При вызове сервер не блокируется, а клиент не разблокируется.

Возможный вариант схемы обмена:

1.Клиент создает большое сообщение с заголовком и посылает его серверу

2.Сервер принимает небольшую часть сообщения MsgReceive(…), а затем читает остальную часть с помощью MsgRead(…)

int MsgWrite(int rcvid, void* msg, int nbytes, int offset)

rcvid – откуда в сервере

msg – кому писать

nbytes – количество байт

offset – смещение в клиентском буфере

Сервер порциями передает данные, когда будет передана последняя порция данных, сервер делает вызов: MsgReply(rcvid, EOK, &header, sizeof(header)), чтобы «разбудить» клиента или MsgReply(rcvid, EOK, NULL, 0) указывая количество данных, которое он записал в клиентский буфер.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]