next up previous contents
Next: Передача произвольных типов данных Up: Упрощенный интерфейс RPC. Previous: Клиентская часть.   Contents

Серверная часть.

Программа сервера, использующая упрощенный интерфейс, достаточно простая (рис. 36). Она вызывает rpc_reg(), чтобы зарегистрировать процедуру, которая будет вызвана, а затем вызывает svc_run(), диспетчера удаленных процедур библиотеки RPC, который ждет входящих запросов.

Прототип rpc_reg():

int rpc_reg(u_long prognum /* Номер программы сервера */,

      u_long versnum /* Номер версии сервера */,

      u_long procnum /* Номер процедуры сервера */,

      char *procname /* Имя удаленной функции */,

      xdrproc_t inproc /* Фильтр для кодирования аргумента arg */,

      xdrproc_t outproc /* Фильтр декодирования результата*/,

      char *nettype /* Выбор транспортной службы */);

svc_run() вызывает сервисные процедуры в ответ на вызовы RPC. Диспетчер в rpc_reg() заботится о расшифровывании аргументов удаленных процедур, и о зашифровывании результатов, с использованием фильтров XDR, определенных при регистрации удаленной процедуры.

Некоторые замечания относительно программы сервера:

Иногда программа, написанная вручную, более компактна, чем созданная с помощью rpcgen. Ниже приведен пример процедуры регистрации. Он регистрирует единственную процедуру и вызывает svc_run(), чтобы обслуживать запросы.

#include <stdio.h> 

#include <rpc/rpc.h>

#include <rpcsvc/rusers.h>

 

void *rusers();

 

main()

{

  if(rpc_reg(RUSERSPROG, RUSERSVERS,

     RUSERSPROC_NUM, rusers,

     xdr_void, xdr_u_long,

     "visible") == -1) {

        fprintf(stderr, "Невозможно зарегистрировать\n");

        exit(1);

  }

  svc_run(); /* Процедура без возврата */

  fprintf(stderr, "Ошибка: Выход из svc_run!\n");

  exit(1);

}

Рис. 36. Серверная часть приложения.

rpc_reg() можно вызвать сколько угодно раз, чтобы зарегистрировать все различные программы, версии, и процедуры.



2003-12-09