Чтение онлайн

ЖАНРЫ

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:
Листинг 16.11. Файл спецификации XDR

//sunrpc/xdr1/data.x

1 enum result_t {

2 RESULT_INT = 1, RESULT_DOUBLE = 2

3 };

4 union union_arg switch (result_t result) {

5 case RESULT_INT:

6 int intval;

7 case RESULT_DOUBLE:

8 double doubleval;

9 default:

10 void;

11 };

12 struct data {

13 short short_arg;

14 long long_arg;

15 string vstring_arg<128>; /*
строка переменной длины */

16 opaque fopaque_arg[3]; /* скрытые данные фиксированной длины */

17 opaque vopaque_arg<>; /* скрытые данные переменной длины */

18 short fshort_arg[4]; /* массив фиксированной длины */

19 long vlong_arg<>; /* массив переменной длины */

20 union_arg uarg;

21 };

Объявление перечисления и размеченного объединения

1-11 Мы объявляем перечислимый тип с двумя значениями и размеченное объединение, использующее это перечисление в качестве дискриминанта. Если дискриминант имеет значение RESULT_INT, после значения дискриминанта передается целое число. Если дискриминант имеет значение RESULT_DOUBLE, за ним передается число с плавающей точкой двойной точности. В противном случае после дискриминанта не передается ничего. 

Объявление структуры

12-21 Мы объявляем структуру, состоящую из различных типов, поддерживаемых XDR.

Поскольку мы не объявляем процедур RPC, программа rpcgen не создаст заглушку клиента и заглушку сервера. Однако она создаст заголовочный файл data.h и файл data_xdr.с, содержащий функции XDR, обеспечивающие кодирование и декодирование данных, объявленных в файле data.х.

В листинге 16.12 приведен получающийся в результате работы rpcgen заголовочный файл data.h. Содержимое этого файла выглядит так, как мы и предполагали (табл. 16.2).

Листинг 16.12. Заголовочный файл data.h, созданный rpcgen из файла data.x

//sunrpc/xdr1/data.h

1 /*

2 * Please do not edit this file. It was generated using rpcgen.

3 */

4 #ifndef _DATA_H_RPCGEN

5 #define _DATA_H_RPCGEN

6 #include <rpc/rpc.h>

7 enum result_t {

8 RESULT_INT = 1,

9 RESULT_DOUBLE = 2

10 };

11 typedef enum result_t result_t;

12 struct union_arg {

13 result_t result;

14 union {

15 int intVal;

16 double doubleval;

17 } union_arg_u;

18 };

19 typedef struct union_arg union_arg;

20 struct data {

21 short short_arg;

22 long long_arg;

23 char *vstring_arg;

24 char fopaque_arg[3];

25 struct {

26 u_int vopaque_arg_len;

27 char *vopaque_arg_val;

28 } vopaque_arg;

29 short fshort_arg[4];

30 struct {

31 u_int vlong_arg_len;

32 long *vlong_arg_val;

33 } vlong_arg;

34 union_arg uarg;

35 };

36 typedef struct data data:

37 /* 4the xdr functions */

38 extern bool_t xdr_result_t(XDR *, result_t*);

39 extern bool_t xdr_union_arg(XDR *, union_arg*);

40 extern bool_t xdr_data(XDR *, data*);

41 #endif /* !_DATA_H_RPCGEN */

В

файле data_xdr.с объявляется функция xdr_data, вызываемая для кодирования и декодирования структуры data, которую мы определили. Суффикс имени функции _data соответствует имени нашей структуры из листинга 16.11. Первая программа, которую мы напишем, будет называться write.с. Она будет присваивать значения полям структуры data, вызывать xdr_data для кодирования всех полей в формат XDR и записывать результат в стандартный поток вывода.

Эта программа приведена в листинге 16.13.

Листинг 16.13. Инициализация структуры и кодирование ее в XDR

//sunrpc/xdr1/write.c

1 #include "unpipc.h"

2 #include "data.h"

3 int

4 main(int argc, char **argv)

5 {

6 XDR xhandle;

7 data out; /* структура, с которой мы работаем */

8 char *buff; /* результат кодирования в XOR */

9 char vop[2];

10 long vlong[3];

11 u_int size;

12 out.short_arg = 1;

13 out.long_arg = 2;

14 out.vstring_arg = "hello, world"; /* присваиваем значение указателю */

15 out.fopaque_arg[0] = 99; /* скрытые данные фиксированной длины */

16 out.fopaque_arg[1] = 88;

17 out.fopaque_arg[2] = 77;

18 vop[0] = 33; /* скрытые данные переменной длины */

19 vop[1] = 44;

20 out.vopaque_arg.vopaque_arg_len = 2;

21 out.vopaque_arg.vopaque_arg_val = vop;

22 out.fshort_arg[0] = 9999; /* массив фиксированной длины */

23 out.fshort_arg[1] = 8888;

24 out.fshort_arg[2] = 7777;

25 out.fshort_arg[3] = 6666;

26 vlong[0] = 123456; /* массив переменной длины */

27 vlong[l] = 234567;

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