Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 107

Автор Уильям БтивСнс

Π’ Ρ„Π°ΠΉΠ»Π΅ 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");

37  size = xdr_getpos(&xhandle);

38  Write(STDOUT_FILENO, buff, size);

39  exit(0);

40 }

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ элСмСнтов структуры Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ значСниями

12-32 Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ присваиваСм полям структуры Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния. Π’ случаС ΠΏΠΎΠ»Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ этих ΠΏΠΎΠ»Π΅ΠΉ. ΠœΡ‹ присваиваСм дискриминанту Ρ€Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ объСдинСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ RESULT_INT ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 123.

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π°

33 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ malloc для выдСлСния Π±ΡƒΡ„Π΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ XDR Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹. АдрСс ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚Π½Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ массива char Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ этого.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° XDR Π² памяти

34 Ѐункция Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния xdrmem_create ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΡƒΡ„Π΅Ρ€, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ buff, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для использования функциями XDR ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π² памяти. ΠœΡ‹ выдСляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° XDR с ΠΈΠΌΠ΅Π½Π΅ΠΌ xhandle ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ адрСс этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° XDR Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±ΡƒΡ„Π΅Ρ€, Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΈ Ρ‚. ΠΏ.). ПослСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ XDR_ENCODE, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ XDR Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ прСобразования Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΡƒΠ·Π»Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ XDR.

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ структуры

35-36 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ xdr_data, ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ rpcgen Π² Ρ„Π°ΠΉΠ»Π΅ data_xdr.c, ΠΈ ΠΎΠ½Π° ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ структуру out Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ XDR. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ запись ΠΈΡ… Π² ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°

37-38 Ѐункция xdr_getpos Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ XDR Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сдвиг Π±Π°ΠΉΡ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅). Π•Π³ΠΎ ΠΌΡ‹ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΠ΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊ записи Π΄Π°Π½Π½Ρ‹Ρ…. 

Π’ листингС 16.14 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ read, которая считываСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°, записанного ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ значСния всСх ΠΏΠΎΠ»Π΅ΠΉ структуры data.

Листинг 16.14. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ структуры data ΠΈΠ· Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° XDR

//sunrpc/xdr1/read.c

1  #include "unpipc.h"

2  #include "data.h"


3  int

4  main(int argc, char **argv)

5  {

6   XDR xhandle;

7   int i;

8   char *buff;

9   data in;

10  ssize_t n;

11  buff = Malloc(BUFFSIZE); /* адрСс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚Π΅Π½ 4-ΠΌ Π±Π°ΠΉΡ‚Π°ΠΌ */

12  n = Read(STDIN_FILENO, buff, BUFFSIZE);

13  printf("read %ld bytes\n", (long) n);

14  xdrmem_create(&xhandle, buff, n, XDR_DECODE);

15  memset(&in, 0, sizeof(in));

16  if (xdr_data(&xhandle, &in) != TRUE)

17   err_quit("xdr_data error");

18  printf("short_arg = %d, long_arg = %ld, vstring_arg = '%s'\n",

19   in.short_arg, in.long_arg, in.vstring_arg);

20  printf("fopaque[] = %d, %d, %d\n",

21   in.fopaque_arg[0], in.fopaque_arg[1], in.fopaque_arg[2]);

22  printf("vopaque<> =");

23  for (i = 0; i < in.vopaque_arg.vopaque_arg_len; i++)

24   printf(" %d", in.vopaque_arg.vopaque_arg_val[i]);

25  printf("\n");

26  printf("fshort_arg[] = %d, %d, %d, %d\n", in.fshort_arg[0],

27   in.fshort_arg[1], in.fshort_arg[2], in.fshort_arg[3]);

28  printf("vlong<> =");

29  for (i = 0; i < in.vlong_arg.vlong_arg_len; i++)

30   printf(" %ld", in.vlong_arg.vlong_arg_val[i]);

31  printf("\n");

32  switch (in.uarg.result) {

33  case RESULT_INT:

34   printf("uarg (int) = %d\n", in.uarg.union_arg_u.intval);

35   break;

36  case RESULT_DOUBLE:

37   printf("uarg (double) = %g\n", in.uarg.union_arg_u.doubleval);

38   break;

39  default:

40   printf("uarg (void)\n");

41   break;

42  }

43  xdr_free(xdr_data, (char*)&in);

44  exit(0);

45 }

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ располоТСнного Π±ΡƒΡ„Π΅Ρ€Π°

11-13 ВызываСтся функция malloc для выдСлСния Π±ΡƒΡ„Π΅Ρ€Π°. Π’ этот Π±ΡƒΡ„Π΅Ρ€ считываСтся Ρ„Π°ΠΉΠ», созданный ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° XDR, инициализация Π±ΡƒΡ„Π΅Ρ€Π°, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

14-17 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ XDR, ΡƒΠΊΠ°Π·Π°Π² Ρ„Π»Π°Π³ XDR_DECODE, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ производится ΠΈΠ· Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° XDR Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΡƒΠ·Π»Π°. ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ структуру i n нулями ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ xdr_data для дСкодирования содСрТимого Π±ΡƒΡ„Π΅Ρ€Π° buff Π² эту структуру. ΠœΡ‹ обязаны ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ структуру нулями, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ XDR (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, xdr_string) Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ выполнСния этого условия. xdr_data β€” это Ρ‚Π° ΠΆΠ΅ функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Π² листингС 16.13. ИзмСнился Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ xdrmem_create: Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ XDR_ENCODE, Π° Π² этой β€” XDR_DECODE. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сохраняСтся Π² дСскрипторС XDR (xhandle) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ xdrmem_create ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ XDR для Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ….

Π’Ρ‹Π²ΠΎΠ΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»Π΅ΠΉ структуры

18-42 ΠœΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ значСния всСх ΠΏΠΎΠ»Π΅ΠΉ структуры data.

ОсвобоТдСниС Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ XDR памяти

43 Для освобоТдСния памяти ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ xdr_free (см. ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.10).

Запустим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ write Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Sparc, ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΠ² стандартный Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ data:

solaris % write > data

solaris % ls -l data

-rw-rw-r-- 1 rstevens other1 76 Apr 23 12:32 data

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Ρ€Π°Π²Π΅Π½ 72 Π±Π°ΠΉΡ‚Π°ΠΌ Ρ‡Ρ‚ΠΎ соотвСтствуСт рис. 16.4, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° схСма хранСния Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² этот Ρ„Π°ΠΉΠ» Π² BSD/OS ΠΈΠ»ΠΈ Digital Unix, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈ рассчитывали:

bsdi % read < data

read 76 bytes

short_arg = 1, long_arg = 2, vstring_arg = 'hello, world'

fopaque[] =99, 88, 77

vopaque<> = 33 44

fshort_arg[] = 9999, 8888, 7777, 6666

vlong<> = 123456 234567 345678

uarg (int) = 123

alpha % read < data

read 76 bytes

short_arg = 1, long_arg = 2, vstring_arg = 'hello, world'

fopaque[] = 99, 88, 77

vopaque<> = 33 44

fshort_arg[] = 9999, 8888, 7777, 6666

vlong<> = 123456 234567 345678

uarg (int) = 123

Рис. 16.4. Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° XDR, записанный Π² листингС 16.13

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: вычислСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΡƒΡ„Π΅Ρ€Π°

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ выдСляли Π±ΡƒΡ„Π΅Ρ€ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° BUFFSIZE (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ unpiрс.h Π² листингС Π’.1), ΠΈ этого Π±Ρ‹Π»ΠΎ достаточно. К соТалСнию, Π½Π΅ сущСствуСт простого способа Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ объСм памяти, Π½ΡƒΠΆΠ½Ρ‹ΠΉ XDR для кодирования ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ структуры Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ sizeof нСдостаточно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅ кодируСтся XDR ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Нам придСтся ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнты структуры, прибавляя ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ объСм памяти, Π½ΡƒΠΆΠ½Ρ‹ΠΉ XDR для кодирования ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ элСмСнта. Π’ листингС 16.15 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ простой структуры с трСмя полями.

Листинг 16.15. БпСцификация XDR для простой структуры

//sunrpc/xdrl/examplΠ΅.Ρ…

1 const MAXC = 4;

2 struct example {

3  short a;

4  double b;

5  short c[MAXC];

6 };

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, тСкст ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 16.16, вычисляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ XDR для кодирования этой структуры. Он получаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ 28 Π±Π°ΠΉΡ‚.