Читать «UNIX: взаимодействие процессов» онлайн - страница 284

Уильям Ричард Стивенс

Sun RPC использует стандарт XDR (External Data Representation — представление внешних данных) для описания и кодирования данных (RFC 1832 [19]). XDR является одновременно языком описания данных и набором правил для их кодирования. В XDR используется скрытая типизация (implicit typing), то есть отправитель и получатель должны заранее знать тип и порядок данных. Например, два 32-разрядных целых, одно число с плавающей точкой и одинарной точностью и строка символов.

ПРИМЕЧАНИЕ

Приведем сравнение из мира OSI. Для описания данных обычно используется нотация ASN.1 (Abstract Syntax Notation one), а для кодирования — BER (Basic Encoding Rules). Эта схема также использует явную типизацию, то есть перед каждым значением указывается его тип. В нашем примере поток байтов содержал бы: спецификатор типа целого, целое, спецификатор типа целого, целое, спецификатор типа single, число с плавающей точкой и одинарной точностью, спецификатор типа строки символов, строку символов.

Представление всех типов согласно XDR требует количества байтов, кратного четырем. Эти байты всегда передаются в порядке big-endian. Целые числа со знаком передаются в дополнительном коде, а числа с плавающей точкой передаются в формате IEEE. Поля переменной длины могут содержать до 3 байтов дополнения в конце, так чтобы подогнать начало следующего элемента до адреса, кратного четырем. Например, 5-символьная строка АSСII будет передана как 12 байтов:

■ 4-байтовое целое, содержащее значение 5;

■ 5-байтовая строка;

■ 3 байта со значением 0 (дополнение).

При описании XDR и поддерживаемых типов данных следует уточнить три момента.

1. Как объявляются переменные различных типов в файле спецификации RPC (файл с расширением .х)? В наших примерах пока что использовалось только длинное целое.

2. В какой тип языка С преобразуется данный тип программой rpcgen при составлении заголовочного файла?

3. Каков реальный формат передаваемых данных?

Таблица 16.2 содержит ответы на первых два вопроса. Для составления этой таблицы мы создали файл спецификации RPC со всеми поддерживаемыми стандартом XDR типами. Этот файл был обработан rpcgen, после чего мы изучили получившийся заголовочный файл.

Таблица 16.2. Типы данных, поддерживаемые xdr и rpcgen 

Файл спецификации RPC (.x) Заголовочный файл языка С (.h)
1 const name = value #define name value
2 typedef declaration; typedef declaration;
3 char var; short var; int var; long var; hyper var; char var; short var; int var; long var; longlong_t var;
4 unsigned char var; unsigned short var; unsigned int var; unsigned long var; unsigned hyper var; u_char var; u_short var; u_int var; u_long var; u_longlong_t var;
5 float var; double var; quadruple var; float var; double var; quadruple var;
6 bool var; bool_t var;
7 enum var {name = const, …} enum var {name = const, …}; typedef enum var var;
8 opaque var[n]; char var[n];
9 opaque var<m>; struct { u_int var_len; char *var_val; } val;
10 string var<m> char *var;
11 datatype var[n]; datatype var[n];
12 datatype var<m> struct { uint var_len; datatype *var_val; } var;
13 struct var {members … }; struct var {members … }; typedef struct var var;
14 union var switch (int disc) { case discvalueA: armdeclA; case discvalueB: amrdeclB; … default: defaultdecl; }; struct var { int disc; union { armdeclA; armdeclB; …  defaultdecl; } var_u; }; typedef struct var var;
15 datatype *name; datatype *name;