next up previous contents
Next: Серверная часть Up: Упрощенный интерфейс RPC Previous: Пример rusers.c   Contents

Клиентская часть

Клиентская часть состоит из вызова функции rpc_call():

#include <stdio.h>

#include <utmp.h> 

#include <rpc/rpc.h>

#include <rpcsvc/rusers.h>

 

/* программа вызывает удаленную программу RUSERSPROG */

 

main(int argc, char **argv)

{

  unsigned long nusers;

  enum clnt_stat cs;

  if (argc != 2) {

    fprintf(stderr, "Использование: rusers hostname\n");

    exit(1);

  }

  if( cs = rpc_call(argv[1], RUSERSPROG,

      RUSERSVERS, RUSERSPROC_NUM, xdr_void,

      (char *)0, xdr_u_long, (char *)&nusers,

      "visible") != RPC_SUCCESS ) {

         clnt_perrno(cs);

         exit(1);

  }

  fprintf(stderr, "%d пользователей на компьютере %s\n",

      nusers, argv[1] );

  exit(0);

}

Синтаксис функции rpc_call() приведен ниже:

int rpc_call (

     /* Имя сервера */

     char *host,

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

     u_long prognum,

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

     u_long versnum,

      /* фильтр XDR для кодирования arg */

     xdrproc_t inproc,

      /* Указатель на аргументы */

     char *in,

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

     xdr_proc_t outproc,

      /* Адрес сохранения результата */

     char *out,

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

     char *nettype

  );

Эта функция вызывает процедуру, указанную prognum, versnum, и procnum на нужном компьютере, указанном host. Аргументы, передаваемые удаленной процедуре, указывают параметром in, а inproc указывает фильтр XDR для кодирования этих аргументов. Параметр out - это адрес, куда помещается результат удаленной процедуры; outproc представляет фильтр XDR, который расшифрует результат и разместит его по этому адресу.

Клиент блокируется вызовом rpc_call() до тех пор, пока он не получит ответ от сервера. Если сервер отвечает, то возвращается RPC_SUCCESS со значением 0. Если запрос был неудачен, возвращается значение, отличное от 0. Это значение можно преобразовать к типу clnt_stat - перечислимому типу, определенному в файле RPC (<rpc/rpc.h>) и интерпретируемому функцией clnt_sperrno(). Эта функция возвращает указатель на стандартное сообщение RPC об ошибке, соответствующее коду ошибки. В примере испытываются все "видимые" транспортные службы, внесенные в /etc/netconfig. Настройка количества повторов требует использования более низких уровней библиотеки RPC. Множественные аргументы и результаты обрабатываются с помощью объединения их в структуры.

Поскольку типы данных могут быть представлены на различных машинах различным образом, то для rpc_call() нужно указать и тип аргумента, и указатель на него (аналогично и для результата). Возвращаемое значение для RUSERSPROC_NUM - unsigned long, поэтому первым возвращаемым параметром rpc_call() будет xdr_u_long, а вторым - *nusers. Поскольку RUSERSPROC_NUM не имеет аргументов, функцией шифрования XDR для rpc_call() будет xdr_void(), а ее аргумент имеет значение NULL.



2004-06-22