Π ΡΠ°ΠΉΠ»Π΅ 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 Π±Π°ΠΉΡ.