Код клиентской программы

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

Для данного примера приложения базы данных словаря программа rpcgen вырабатывает файл rdict_clnt.c — исходный код программы, которая будет выполнять функции клиентской заглушки связи в распределенной версии приложения. дренажный насос grundfos

Листинг 23.3. Файл rdict__clnt.c - пример клиентской заглушки, сформированной программой rpcgen

int *
deletewj(char **argp, CLIENT *clnt) {
static int clntjres;
memset ((char *)&clntjes, 0, sizeof (clnt res)); if (clnt^call (clnt, DELETEW,
(xdrprocj) xdrj/rapstring, (caddrJ) argp,
(xdrprocj) xdrjnt, (caddr t) fcclntjes,
TIMEOUT) != RPC_SUCCESS) { ~
return (NULL);
}
return (Sclntjes);

int *
lookupwJ(char **argp, CLIENT *clnt) {
static int clntjes;
memset ((char *)&clntjes, 0, sizeof (clntjes)); if (clnt_call (clnt, LOOKUPW,
(xdrprocjt) xdr__wrapstring, (caddrJ) argp,
(xdrprocj) xdrjnt, (caddrJ) fcclntjes,
TIMEOUT) != RPCJ3UCCESS) {
return (NULL);
}
return (Sclntjes);
 

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

Код серверной программы, сформированный программой rpcgen

В этом примере базы данных словаря программа rpcgen вырабатывает четвертый файл rdict_svc.c, который содержит код, необходимый для сервера. Этот файл содержит главную процедуру, вызываемую на выполнение после запуска серверной программы. Эта процедура получает порт протокола, регистрирует программу RPC в службе привязки портов, а затем переходит в состояние ожидания для получения вызовов RPC. Каждый поступивший вызов перенаправляется в соответствующую интерфейсную процедуру серверной заглушки. После получения ответа от вызванной процедуры сервер создает ответ RPC и отправляет его клиенту

Файл rdict_svc.c - пример серверной заглушки, сформированной программой rpcgen

int
main (int argc, char **argv) {
register SVCXPRT *transp? pmapjmset (RDICTPROG, RDICTVERS) ?
 
transp * svcudp create(RPC ANYSOCK)? if (transp « NULL) {
fprintf (stderr, "cannot create udp service.");
exit(l);
}
if (Isvc register(transp, RDICTPROG, RDICTVERS, rdictprog 1, IPPROTO UDP)) { fprintf (stderr, "unable to register (RDICTPROG, RDICTVERS, udp)."); exit(l);
}
transp  svctcp create(RPC ANYSOCK, 0, 0)? if (transp     NULL) {
fprintf (stderr, "cannot create tcp service.");
exit(l);
}
if (!svc register(transp, RDICTPROG, RDICTVERS, rdictprog 1, IPPROTO TCP)) { fprintf (stderr, "unable to register (RDICTPROG, RDICTVERS, tcp)."); exit(l);
}
svcjrun ();
fprintf (stderr, "svc run returned")? exit (1)?
/* Недостижимый участок кода */
}
 

После выработки всех файлов их можно оттранслировать и сохранить в виде файлов объектного кода. В системе Linux для трансляции всех трех файлов, содержащих выработанный код, могут применяться следующие команды:

сс -с rdict_clnt.c cc -с rdict_svc.c сс -с rdictjcdr.c 

Каждая команда принимает в качестве параметра файл исходного кода на языке С и вырабатывает соответствующий файл объектного кода. В именах файлов объектного кода расширение .с заменяется расширением .о. Например, оттранслированная версия файла rdict_clnt.c будет помещена в файл rdict_clnt.o.

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