Поделиться через


Дескрипторы контекста

Иногда распределенным приложениям требуется, чтобы серверная программа поддерживала сведения о состоянии между вызовами клиентов. Серверные программы, обслуживающие несколько клиентов одновременно, должны хранить сведения о состоянии каждого клиента. Так как клиент и сервер используют разные адресные пространства на разных компьютерах и не обязательно доверяют друг другу, общие подходы к обмену данными часто не работают. Например, клиент и сервер не могут хранить сведения о состоянии удаленного сеанса в глобальных переменных, так как они не используют одно и то же глобальное адресное пространство. Эти сведения трудно хранить в общем файле, так как они выполняются на разных компьютерах. Упрощенный подход может быть в том, чтобы отправить все состояние клиенту и заставить клиента вернуть его при следующем вызове, но этот подход имеет недостатки: сервер не обязательно доверяет клиенту вернуть правильное состояние, а состояние может быть неявно привязано к другому состоянию на сервере, например к дескрипторам файлов или открытым сокетам.

Microsoft RPC предоставляет мощный и безопасный механизм, называемый дескрипторами контекста, для сохранения состояния, связанного с данным клиентом на сервере. Сведения о состоянии называются контекстом сервера. Клиенты могут получить дескриптор контекста для идентификации контекста сервера для отдельных сеансов RPC.

Например, для каждого клиента в распределенном приложении серверная программа может создать и обновить файл данных для сеанса RPC. Сервер может использовать дескриптор файла для каждого файла данных клиента в качестве дескриптора контекста. Каждый раз, когда клиент запрашивает операции с файлом данных, который сервер создает для него, клиент передает дескриптор контекста серверу. Клиент фактически не получает сам дескриптор файла; он получает непрозрачный маркер, который время выполнения RPC сервера может однозначно связать с дескриптором файла. Так как дескриптор контекста на самом деле является дескриптором файла, дескриптор контекста имеет смысл только в адресном пространстве сервера. Однако клиентская программа может использовать дескриптор контекста, чтобы сообщить серверу, в каком файле выполнять обновления.

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

Чаще всего дескриптор контекста указывает на блок памяти на сервере, где сервер хранит различные сведения об управлении.

В этом разделе представлены сведения об определении и использовании дескрипторов контекста. Обсуждение представлено в следующих разделах: