//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, /* ΠΎΡΠΈΠ±ΠΊΠ° Π² Π»ΠΈΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π½Π°ΡΡΡΠ΅Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ ΡΡΠΌΠΌΠ°) */