Этап 5: подготовка интерфейсных процедур-заглушек

Опубликовано в Технологии > Серверные технологии Продолжение

Клиентская часть первоначальной прикладной программы управляет обработкой. В ней вызываются интерфейсные процедуры с использованием тех же имен процедур и типов параметров, которые первоначально служили для вызова этих процедур, ставших удаленными в распределенной версии. Каждая интерфейсная процедура должна преобразовывать свои параметры в форму, применяемую программой rpcgen, а затем вызывать соответствующую клиентскую процедуру связи. Например, поскольку первоначальная программа содержит процедуру insertw, которая принимает в качестве параметра указатель на символьную строку, то такую же процедуру должен включать клиентский интерфейс. Интерфейсная процедура вызывает insertw_l — клиентскую заглушку связи, сформированную программой rpcgen. фузариоз астр

Основное различие между параметрами локальной процедуры и параметрами, применяемыми в заглушках связи, состоит в том, что в параметрах всех процедур, выработанных программой rpcgen, используется косвенная адресация. Например, если в первоначальной процедуре имеется целочисленный параметр, то соответствующий параметр в заглушке связи для этой процедуры должен представлять собой указатель на целое число. В программе базы данных словаря для большинства процедур требуется параметр типа символьной строки, который в языке С объявляется как указатель на символ (char *). В соответствующих заглушках связи все подобные параметры должны представлять собой указатель, который ссылается на указатель на символ (char **).

Файл rdict_cif .с может служить иллюстрацией того, как интерфейсные процедуры преобразовывают параметры в форму, приемлемую для кода, выработанного программой rpcgen. Этот файл содержит по одной клиентской интерфейсной процедуре для каждой из удаленных процедур программы.

/* Файл rdict_cif.c - процедуры initw, insertw, deletew, lookupw */
tinclude 
tinclude 
tdefine RPC_CLNT tinclude "rdict.h"
/* Клиентские процедуры-заглушки, написанные программистом */
extern    CLIENT *handle;    /* Дескриптор для удаленной процедуры */
static    int *ret;	/* Область памяти для временного */
/* хранения кода возврата */
 

Серверные интерфейсные процедуры

Интерфейсные процедуры серверной части принимают вызовы от заглушек связи, созданных программой rpcgen, и передают управление процедуре, которая выполняет указанный вызов. Как и в клиентской части, серверные интерфейсные процедуры должны преобразовать типы параметров, выбранные программой rpcgen, в типы параметров, которые применяются в вызываемых процедурах. В большинстве случаев различие между типами параметров заключается только в применении дополнительного уровня косвенной адресации: программа rpcgen предусматривает передачу указателя на объект вместо самого объекта. Для преобразования типа параметра в интерфейсной процедуре достаточно применить только оператор косвенной адресации языка С (*). Этот принцип проиллюстрирован в файле rdict_sif ,с, который содержит серверные интерфейсные процедуры для программы базы данных словаря.

/* Файл rdict_sif.c - процедуры init_l, insert_l, delete_l, lookup_l_svc */ tinclude 
tdefine    RPC SVC tinclude "rdict.h"
/* Серверные процедуры-заглушки, написанные программистом */ static    int retcode;
int    initw(void), insertw(char *), deletew(char *), lookupw(char *);
/*		
*	Процедура insertw_l_svc - серверный интерфейс к удаленной процедуре insertw
*	Г	
*/ int *
insertw l_svc(char **w, struct svc req *rqstp) {
retcode  insertw(*(char **)w); return fcretcode;
}
 
Похожие статьи