Регистрация процедуры в качестве сервера на узле сети выполняется функцией registerrpc, имеющей следующий вид
#include <sys/types.h>
#include <rpc/rpc.h>
int registerrpc (prognum, vernum, procnum, procname,
inproc, outproc)
u_long prognum;
u_long vernum;
u_long procnum;
char *(*procname) ();
xdrproc_t inproc;
xdrproc_t outproc;
Аргументы prognum, vernum и procnum задают номера программы, версии и процедуры соответственно. Номера версии и процедуры назначаются программистом произвольно. Номер же программы, находящейся в стадии разработки, должен назначаться из диапазона 0x20000000...0x3fffffff.
Аргумент procname задает функцию языка программирования СИ, регистрируемую в качестве сервера. Эта функция (процедура) вызывается с указателем на ее аргумент и должна возвращать указатель на свой результат, располагаемый в статической или динамически выделенной (функциями malloc или calloc) памяти. Для хранения результата нельзя использовать автоматически выделяемую память (напоминаем, что локальные переменные функций располагаются именно в такой памяти).
Аргументы inproc и outproc задают XDR-функции преобразования, соответственно, аргумента и ее результата.
|
|
При успешном выполнении функция registerrpc возвращает 0, иначе - число "-1".
Диспетчеризация запросов к процедурам-серверам
Для приема запросов к процедурам-серверам от клиентов и диспетчеризации их используется функция svc_run, имеющая следующий вид
#include <rpc/rpc.h>
void svc_run ();
Не имеющая аргументов функция svc_run должна вызываться после регистрации всех диспетчируемых ею процедур-серверов. При успешном выполнении svc_run никогда не возвращает управление в вызвавшую ее программу.