Этап 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;
}