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

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

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

//sunrpc/xdr1/opt2.h

7  struct mylist {

8   char *name;

9   long value;

10  struct mylist *next;

11 };

12 typedef struct mylist mylist;


13 struct args {

14  mylist *list;

15 };

16 typedef struct args args;

Π’ листингС 16.23 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ связный список с трСмя ΠΏΠ°Ρ€Π°ΠΌΠΈ имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ XDR.

Листинг 16.23. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ, ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ связного списка ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°

1  //sunrpc/xdr1/opt2.c

2  #include "unpipc.h"

3  #include "opt2.h"


4  int

5  main(int argc, char **argv)

6  {

7   int i;

8   XDR xhandle;

9   long *lptr;

10  args out; /* структура, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ заполняСм */

11  char *buff; /* Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ кодирования */

12  mylist nameval[4]; /* Π΄ΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… элСмСнтов Π² спискС */

13  size_t size;

14  out.list = &nameval[2]; /* [2] –> [1] –> [0] */

15  nameval[2].name = "name1";

16  nameval[2].value = 0x1111;

17  nameval[2].next = &nameval[1];

18  nameval[1].name = "namee2";

19  nameval[1].value = 0x2222;

20  nameval[1].next = &nameval[0];

21  nameval[0].name = "nameee3";

22  nameval[0].value = 0x3333;

23  nameval[0].next = NULL;

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

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

26  if (xdr_args(&xhandle, tout) != TRUE)

27   err_quit("xdr_args error");

28  size = xdr_getpos(&xhandle);

29  lptr = (long*)buff;

30  for (i = 0; i < size; i += 4)

31   printf("%8lx\n", (long)ntohl(*lptr++));

32  exit(0);

33 }

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ связного списка

11-22 ΠœΡ‹ выдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ элСмСнта, Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΠΈ ΠΈΠ· Π½ΠΈΡ…. ΠŸΠ΅Ρ€Π²Π°Ρ запись nameval[2], ΠΏΠΎΡ‚ΠΎΠΌ nameval[1] ΠΈ nameval[0]. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ списка (out.list) устанавливаСтся Π½Π° &nameval[2]. ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ список Π² Ρ‚Π°ΠΊΠΎΠΌ порядкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° XDR ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ порядок Π² спискС оказываСтся ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ½ Π±Ρ‹Π» Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΈ Π½Π΅ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ массивы для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ значСния элСмСнтов списка ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ… Π² этом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.

Π’Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом списка ΠΈΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 Π² 4 Π±Π°ΠΉΡ‚Π°Ρ… (Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½ΠΎΠΉ массива ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом ΠΈΠ»ΠΈ булСвским Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ TRUE). ЧСтвСртая запись состоит ΠΈΠ· 4 Π±Π°ΠΉΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… записан 0. Она ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ† списка:

solaris % opt2

1        Π΄Π°Π»ΡŒΡˆΠ΅ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт

5        Π΄Π»ΠΈΠ½Π° строки

6e616d65 имя(name)

31000000 1 ΠΈ Ρ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚Π° дополнСния

1111     Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

1        ΠΎΠ΄ΠΈΠ½ элСмСнт

6        Π΄Π»ΠΈΠ½Π° строки

6e616d65 имя

65320000 Π΅ 2 ΠΈ 2 Π±Π°ΠΉΡ‚Π° дополнСния

2222     Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

1        ΠΎΠ΄ΠΈΠ½ элСмСнт

7        Π΄Π»ΠΈΠ½Π° строки

6e616d65 имя

65653300 Π΅ Π΅ 3 ΠΈ 1 Π±Π°ΠΉΡ‚ дополнСния

3333     Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

0        ΠΊΠΎΠ½Π΅Ρ† списка

ΠŸΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ списка Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° XDR Π±ΡƒΠ΄Π΅Ρ‚ динамичСски Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ Π΅Π³ΠΎ элСмСнты ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ всС это вмСстС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта списка ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° Π‘.

16.9. Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² RPC

На рис. 16.5 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ запроса RPC Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ TCP.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ TCP ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ Π½Π΅ прСдусматриваСт Π³Ρ€Π°Π½ΠΈΡ† сообщСний, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ способ разграничСния сообщСний. Sun RPC опрСдСляСт запись ΠΊΠ°ΠΊ запрос ΠΈΠ»ΠΈ ΠΎΡ‚Π²Π΅Ρ‚, ΠΈ каТдая запись состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ начинаСтся с 4-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ значСния: ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±ΠΈΡ‚ являСтся Ρ„Π»Π°Π³ΠΎΠΌ послСднСго Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°, Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 31 Π±ΠΈΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой счСтчик (Π΄Π»ΠΈΠ½Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°). Если Π±ΠΈΡ‚ послСднСго Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π΅ являСтся послСдним Π² записи.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π­Ρ‚ΠΎ 4-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСдаСтся Π² порядкС big-endian, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ 4-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ Π² XDR, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ относится ΠΊ стандарту XDR, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ прСдусматриваСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.

Если вмСсто TCP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ UDP, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ UDP Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (XID), ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 16.7.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ΠŸΡ€ΠΈ использовании TCP Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ запроса ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° RPC ограничСния Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ любоС количСство Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ², Π° Π΄Π»ΠΈΠ½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… задаСтся 31-разрядным Ρ†Π΅Π»Ρ‹ΠΌ. Но ΠΏΡ€ΠΈ использовании ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° UDP запрос (ΠΈ ΠΎΡ‚Π²Π΅Ρ‚) Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π° максимальноС количСство Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½Π΅ΠΉ β€” 65507 Π±Π°ΠΉΡ‚ (для IPv4). Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… рСализациях, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΡ… TI-RPC, Ρ€Π°Π·ΠΌΠ΅Ρ€ ограничивался Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΊΠΎΠ»ΠΎ 8192 Π±Π°ΠΉΡ‚, поэтому Ссли трСбуСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 8000 Π±Π°ΠΉΡ‚, слСдуСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ TCP.

Рис. 16.5. Запрос RPC Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ TCP


ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ XDR для запроса RPC, Π²Π·ΡΡ‚ΡƒΡŽ ΠΈΠ· RFC 1831. ИмСна Π½Π° рис. 16.5 взяты ΠΈΠ· этой спСцификации:

enum autn_flavor {

 AUTH_NONE = 0,

 AUTH_SYS = 1,

 AUTH_SHORT = 2

 /* and more to be defined */

};

struct opaque_auth {

 auth_flavor flavor;

 opaque body<400>;

};

enum msg_type {

 CALL = 0,

 REPLY = 1

};

struct call_body {

 unsigned int rpcvers; /* вСрсия RPC: Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ 2 */

 unsigned int prog; /* Π½ΠΎΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

 unsigned int vers; /* Π½ΠΎΠΌΠ΅Ρ€ вСрсии */

 unsigned int proc; /* Π½ΠΎΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ */

 opaque_auth cred; /* Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ */

 opaque_auth verf; /* провСрочная информация Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ */

/* ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, относящиСся ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ */

};

struct rpc_msg {

 unsigned int xid;

 union switch (msg_type mtype) {

 case CALL:

  call_body cbody;

 case REPLY:

  reply_body rbody;

 } body;

};

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ скрытых Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, содСрТащих свСдСния ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Для Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π΄Π»ΠΈΠ½Π° этих Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ установлСна Π² 0. Для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Unix эти Π΄Π°Π½Π½Ρ‹Π΅ содСрТат ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру:

struct authsys_parms {

 unsigned int stamp;

 string machinename<255>;

 unsigned int uid;

 unsigned int gid;

 unsigned int gids<16>;

};

Если Ρ‚ΠΈΠΏ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ AUTH_SYS, Ρ‚ΠΈΠΏ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ AUTH_NONE. Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° RPC слоТнСС, Ρ‡Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ запроса, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. На рис. 16.6 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. На рис. 16.7 ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° RPC Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. ΠžΡ‚Π²Π΅Ρ‚ пСрСдаСтся ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UDP. 

НиТС приводится тСкст спСцификации XDR ΠΎΡ‚Π²Π΅Ρ‚Π° RPC, взятый ΠΈΠ· RFC 1831.

enum reply_stat {

 MSG_ACCEPTED = 0,

 MSG_DENIED = 1

};

enum accept_stat {

 SUCCESS = 0, /* ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° RPC */

 PROG_UNAVAIL = 1, /* Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ нСдоступСн */

 PROG_MISMATCH = 2, /* Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ вСрсии нСдоступСн */

 PROC_UNAVAIL = 3, /* Π½ΠΎΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ нСдоступСн */

 GARBAGE_ARGS = 4, /* Π½Π΅ ΠΌΠΎΠ³Ρƒ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ */

 SYSTEM_ERR = 5 /* ошибка выдСлСния памяти ΠΈ Ρ‚. ΠΏ. */

};

struct accepted_reply {

 opaque_auth verf;

 union switch (accept_stat stat) {

 case SUCCESS:

  opaque results[0]; /* Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ */

 case PROG_MISMATCH:

  struct {

   unsigned int low; /* наимСньший ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

   unsigned int high; /* наибольший ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

  } mismatch_info;

 default: /* PROG_UNAVAIL, PROC_UNAVAIL, GARBAGE_ARGS, SYSTEM_ERR */

  void;

 } reply_data;

};

union reply_body switch (reply_stat stat) {

case MSG_ACCEPTED:

 accepted_reply areply;

case MSG_DENIED:

 rejected_reply rreply;

} reply;

Рис. 16.6. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² RPC


Π’Ρ‹Π·ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ сСрвСром, Ссли Π½ΠΎΠΌΠ΅Ρ€ вСрсии RPC Π½Π΅ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

enum reject_stat {

 RPC_MISMATCH = 0, /* Π½ΠΎΠΌΠ΅Ρ€ вСрсии RPC ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ 2 */

 AUTH_ERROR =1 /* ошибка Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ */

};

enum auth_stat {

 AUTH_OK = 0, /* ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ */

 /* ошибки Π½Π° сСрвСрС */

 AUTH_BADCRED = 1, /* ошибка Π² Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π½Π°Ρ€ΡƒΡˆΠ΅Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма) */