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

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

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

Прототип rpc_reg() представлен ниже:

int rpc_reg(

    /* Номер программы сервера */

   u_long prognum,

    /* Номер версии сервера */

   u_long versnum,

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

   u_long procnum,

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

   char *procname,

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

   xdrproc_t inproc,

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

   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);

}

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



2004-06-22