Читать «UNIX: взаимодействие процессов» онлайн - страница 288

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

В листинге 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;

28  vlong[2] = 345678;

29  out.vlong_arg.vlong_arg_len = 3;

30  out.vlong_arg.vlong_arg_val = vlong;

31  out.uarg.result = RESULT_INT; /* размеченное объединение */

32  out.uarg.union_arg_u.intval = 123;

33  buff = Malloc(BUFFSIZE); /* кратен 4-м байтам */

34  xdrmem_create(&xhandle, buff, BUFFSIZE, XDR_ENCODE);

35  if (xdr_data(&xhandle, &out) != TRUE)

36   err_quit("xdr_data error");