Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 [ 144 ] 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

char-

hyper:

байт 0 12 3 MSB

такой же формат кодирования для unsigned char, short, unsigned short, int, unsigned int, (ong, unsigned long, bool, enum

такой же формат кодирования для unsigned hyper

байт

4 5 6 7

1 бит - знак

8 бит-экспонента

float:

байт

0 1 < X

3 ->

23 бит - мантисса

ехр мантисса

double:

I

байт

<-

I бит - знак

II бит - экспонента 52 бит - мантисса

мантисса

quadruple:

байт 0 -

1 2 X

11 12

15 ->

1 бит-лнак

15 бит - экспонента

opaque [п]:

... 0

-Lrif-

b<J-1

мантисса

скрытые данные фиксированной длины

байт О 1

п-1<-

г байт, так чтобы (п+г) mod 4 = 0

opaque <m>:

string <m>:

type [n]:

type <m>:

union:

длина m

4 байт

-> 0 1

m-1.

скрытые данные переменной длины

длина т

г байт, так чтобы (т+г) mod 4 = 0 строка

4 байт

т-1.

Гбайт, так чтобы (т+г) mod 4 = 0

element О

element 1

element п -1

массив

фиксированной длины

#elements т

element О

element 1

<->

размер каждого элемента кратен 4 байтам

массив переменной

element т -1

4 байт

длины

размер каждого элемента кратен 4 байтам

дискриминант

соответствующая ветвь

<-X->

4 байт размер ветви кратен 4 байт Рис. 16.3. Кодирование типов данных в XDR



Пример: использование XDR без RPC

Приведем пример использования XDR без RPC. Мы воспользуемся стандартом XDR для кодирования структуры данных в машинно-независимое представление, в котором они могут быть обработаны другими системами. Этот метод может использоваться для написания файлов или для отправки данных по сети в машинно-независимом формате. В листинге 16.11 приведен текст файла спецификации data. X, который на самом деле является файлом спецификации XDR, поскольку мы не объявляем никаких процедур RPC.

ПРИМЕЧАНИЕ -

Суффикс имени файла (.х) происходит от термина файл спецификации XDR . Спецификация RPC утверждает, что язык RPC (RPCL) идентичен XDR в части, относящейся к описанию данных. В RPCL была добавлена только возможность описания процедур.

Листинг 16.11. Файл спецификации XDR

sunrpc/xdrl/data.x

1 enum result t {

2 RESULT INT = 1. RESULT DOUBLE - 2

3 }:

4 union union arg switch (result t result) {

5 case RESULT INT:

intval:

case RESULT DOUBLE:

double

doubleval:

default:

void:

struct data

short

short arg:

long

long arg:

string

vstring arg<128>:

/* строка переменной длины */

opaque

fopaque arg[3]:

/* скрытые данные фиксированной длины

opaque

vopaque argo:

/* скрытые данные переменной длины */

short

fshort arg[4]:

/* массив фиксированной длины */

long

vlong arg<>:

/* массив переменной длины */

union arg

uarg:

21 }:

Объявление перечисления и размеченного объединения

1-11 Мы объявляем перечислимый тип с двумя значениями и размеченное объединение, использующее это перечисление в качестве дискриминанта. Если дискриминант имеет значение RESULT I NT, после значения дискриминанта передается целое число. Если дискриминант имеет значение RESULT DOUBLE, за ним передается число с плавающей точкой двойной точности. В противном случае после дискриминанта не передается ничего.



Объявление структуры

12-21 Мы объявляем структуру, состоящую из различных типов, поддерживаемых XDR.

Поскольку мы не объявляем процедур RPC, программа rpcgen не создаст заглушку клиента и заглушку сервера. Однако она создаст заголовочный файл data. h и файл data xdr. с, содержащий функции XDR, обеспечивающие кодирование и декодирование данных, объявленных в файле data. х.

В листинге 16.12 приведен получающийся в результате работы rpcgen заголовочный файл data. h. Содержимое этого файла выглядит так, как мы и предполагали (табл. 16.2).

Листинг 16.12. Заголовочный файл data.h, созданный rpcgen из файла data.x

sunrpc/xdrl/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 argJen:

27 char *vopaque arg val:

28 } vopaque arg:

29 short f5hort arg[4];

30 struct {

31 ujnt vlong argJen:

32 long *vlong arg val:

33 } vlong arg:

34 union arg uarg;



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 [ 144 ] 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.