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


Подпрограмма запуска контекста сервера

Если связь прерывается, пока сервер поддерживает контекст от имени клиента, может потребоваться подпрограмма очистки для очистки состояния, поддерживаемого сервером от имени данного клиента. Эта подпрограмма очистки называется подпрограммой запуска контекста. При разрыве подключения заглушка сервера и библиотека времени выполнения вызовет эту подпрограмму для каждого дескриптора контекста, открываемого клиентом.

Подпрограмма запуска контекста является обязательной и неявно объявлена и именуется при применении атрибута [context_handle] к определению типа. Сервер не вызовет подпрограмму запуска контекста, если атрибут [context_handle] был применен непосредственно к параметру.

Синтаксис подпрограммы запуска контекста:

void __RPC_USER type-id_rundown (type-id);

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

Следующий фрагмент кода представляет пример подпрограммы запуска контекста. вызывает процедуру RemoteClose, используемую в примере в разработке интерфейса с помощью дескрипторов контекста, разработки сервера с помощьюконтекста и разработки клиента с помощью дескрипторов контекста. Эта процедура закрывает дескриптор файла, освобождает память, связанную с файлом, и назначает null дескриптору контекста. Назначение NULL является результатом вызова функции RemoteClose и не требуется в сценарии запуска. Время выполнения RPC очищает состояние независимо от того, установлен ли дескриптор контекста null.

//file: cxhndp.c (fragment of file containing remote procedures)
//The rundown routine is associated with the context handle type.  
void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown(
    PCONTEXT_HANDLE_TYPE phContext)
{
    printf("Client died with an open file, closing it..\n");
    RemoteClose(&phContext);
    assert(phContext == 0);
}