Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример использования средств RPC




XDR-функции

Для преобразования данных в/из XDR-формат библиотека функций RPC содержит ряд функций, некоторые из них перечислены ниже:

xdr_int - для преобразования целых;

xdr_u_int - для преобразования беззнаковых целых;

xdr_short - для преобразования коротких целых;

xdr_u_short - для преобразования беззнаковых коротких целых;

xdr_long - для преобразования длинных целых;

xdr_u_long - для преобразования беззнаковых длинных целых;

xdr_char - для преобразования символов;

xdr_u_char - для преобразования беззнаковых символов;

xdr_wrapstring - для преобразования строк символов (заканчивающихся символом '\0').

В ситуациях, когда в процедуру-сервер аргумент не передается (или от нее не возвращается результат), используется функция-"заглушка" xdr_void.

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

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

 

В данном разделе рассматривается использование средств RPC на очень простом примере взаимодействия программы-клиента с одной удаленной процедурой-сервером.

Содержательная часть программ примитивна:

- процедура-сервер, получив в качестве аргумента запроса целое число, возвращает клиенту строку символов "even" ("четное") или "odd" ("нечетное");

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

3.5.1. Включаемый файл

При разработке прикладных программ средствами RPC целесообразно для номеров программ, версий и процедур определять символические имена в едином файле, включаемом в исходный текст как процедур-серверов, так и клиентов. В нашем примере таким файлом будет файл common.h, имеющий следующий вид

#define MY_PROG (u_long) 0x20000001

#define MY_VER (u_long) 1

#define MY_PROC1 (u_long) 1

3.5.2. Программа-сервер (листинг 12)

Текст программы-сервера на языке программирования СИ выглядит следующим образом

1 #include <rpc/rpc.h>

2 #include <stdio.h>

3 #include "common.h"

4 char **proc1 ();

5 main ()

6 {

7 registerrpc (MY_PROG, MY_VER, MY_PROC1,

proc1, xdr_int, xdr_wrapstring);

8 svc_run();

9 fprintf (stderr, "Error: svc_run returned\n");

10 exit (1);

11 }

12 char **proc1 (indata_p)

13 int *indata_p;

14 {

15 static char *res;

16 static char even[] = {"even"};

17 static char odd[] = {"odd"};

18 printf ("Number recieved is %d\n", *indata_p);

19 if (*indata_p % 2) {

20 res = odd; }

21 else {

22 res = even; };

23 return &res;

24 }

Строки 1...3 описывают включаемые файлы, содержащие определения для всех необходимых структур данных и символических констант.

Строка 4 объявляет тип функции proc1. Это объявление необходимо, поскольку в нашей программе функция proc1 используется (в строке 7) раньше по тексту, чем определяется (в строке 12).

В строке 7 функция proc1 регистрируется в качестве процедуры-сервера, имеющей аргумент в виде целого числа и результат в виде строки символов. Таким образом можно зарегистрировать произвольное количество процедур-серверов с одинаковыми номерами программы и версии.

В строке 8 программа посредством обращения к функции svc_run переходит в состояние ожидания запросов клиентов. Нормально функционирующая программа никогда к выполнению следующих за вызовом svc_run операторов не переходит.

В строках 9 и 10 выводится сообщение об ошибке и завершается выполнение программы с кодом ошибки 1.

Строки 12...24 содержат описание функции proc1. Необходимо еще раз подчеркнуть, что функция работает с указателями на ее аргумент и результат.

Переменные res, even и odd объявлены статическими, чтобы они сохранялись в памяти программы и после выхода из функции proc1.

3.5.3. Программа-клиент (листинг 13)

Текст программы-клиента на языке программирования СИ выглядит следующим образом

1 #include <rpc/rpc.h>

2 #include <stdio.h>

3 #include "common.h"

4 main (argc, argv)

5 int argc;

6 char **argv;

7 {

8 int arg;

9 char *answer;

10 int stat;

11 if (argc < 3) exit (1);

12 arg = strlen (argv[2]);

13 if (stat = callrpc (argv[1], MY_PROG, MY_VER, MY_PROC1,

xdr_int, &arg, xdr_wrapstring, &answer)!= 0) {

14 clnt_perrno (stat);

15 exit (2);

16 };

17 printf ("Number of letters in %s is %s\n",

argv[2], answer);

18 exit (0);

19 }

В строке 11 проверяется количество аргументов командной строки, с помощью которой программа-клиент вызывается на выполнение (аргументов не должно быть меньше двух).

В строке 12 переменной целого типа arg присваивается число, равное количеству символов второго аргумента командной строки.

В строке 13 вызывается удаленная процедура-сервер, резидентная на узле сети, имя которого задается первым аргументом командной строки. Процедуре передается указатель на ее аргумент (целое число), сама же она возвращает также указатель на свой результат (при этом память под возвращаемую строку символов нужного размера автоматически выделяется XDR-функцией xdr_wrapstring).

Строка 14 содержит обращение к функции clnt_perrno, которая выводит в stderr текст сообщения, характеризующего ошибку, которая по разным причинам может возникнуть при выполнении вызова удаленной процедуры.

Строка 17 выводит в stdout сообщение, содержащее ответ удаленной процедуры-сервера.

 




Поделиться с друзьями:


Дата добавления: 2017-02-01; Просмотров: 46; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopediasu.com - Студопедия (2013 - 2026) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.029 сек.