Пример: необязательные данные

Пример: необязательные данные

Существуют три способа задания необязательных данных в файле XDR, примеры для всех приведены в листинге 16.17.

Листинг 16.17. Файл спецификации XDR, иллюстрирующий способы задания необязательных данных

//sunrpc/xdr1/opt1.x

1  union optlong switch (bool flag) {

2  case TRUE:

3   long val;

4  case FALSE:

5   void;

6  };

7  struct args {

8   optlong arg1; /* объединение с булевским дискриминантом */

9   long arg2<1>; /* массив переменной длины с одним элементом */

10  long *arg3; /* указатель */

11 };

Объявление объединения с булевским дискриминантом

1-8 Мы определяем объединение с ветвями FALSE и TRUE и структуру этого типа. Если флаг дискриминанта TRUE, за ним следует значение типа long; в противном случае за ним ничего не следует. После кодирования библиотекой XDR это объединение будет закодировано как:

? 4 байта флага со значением 1 (TRUE) и 4 байта целочисленного значения либо

? 4 байта флага со значением 0 (FALSE).

Объявление массива переменной длины

9 Если мы указываем массив переменной длины с одним возможным элементом, он будет передан как:

? 4 байта со значением 1 и 4 байта значения либо

? 4 байта со значением 0.

Объявление указателя XDR

10 Новый способ определения необязательных данных заключается в объявлении указателя. Он будет закодирован как:

? 4 байта со значением 1 и 4 байта значения либо

? 4 байта со значением 0

в зависимости от значения соответствующего указателя при кодировании данных. Если указатель ненулевой, используется первый вариант кодирования. Если указатель нулевой, получится второй вариант. Это удобный способ кодирования необязательных данных в случае, если в нашем коде имеется указатель на эти данные.

Важная деталь реализации, благодаря которой оба варианта дают одинаковый результат при кодировании, заключается в том, что значение TRUE равно 1, что совпадает с длиной массива переменной длины, когда в нем есть один элемент.

В листинге 16.18 приведен текст заголовочного файла, созданного программой rpcgen для данного файла спецификации.

Листинг 16.18. Заголовочный файл, получившийся в результате обработки листинга 16.17

//sunrpc/xdr1/opt1.h

7  struct optlong {

8   bool_t flag;

9   union {

10  long val;

11  } optlong_u;

12 };

13 typedef struct optlong optlong;

14 struct args {

15  optlong arg1;

16  struct {

17   u_int arg2_len;

18   long *arg2_val;

19  } arg2;

20  long *arg3;

21 };

22 typedef struct args args;

14-21 Хотя все три аргумента кодируются одинаково, способы присваивания и получения их значений в языке С различны.

В листинге 16.19 приведен текст простой пpoгрaммы, устанавливающей значения всех трех аргументов так, что ни одно из полей long не кодируется.

Листинг 16.19. Ни одно из значений не будет закодировано

//sunrpc/xdr1/opt1z.с

1  #include "unpipc.h"

2  #include "opt1.h"

3  int

4  main(int argc, char **argv)

5  {

6   int i;

7   XDR xhandle;

8   char *buff;

9   long *lptr;

10  args out;

11  size_t size;

12  out.arg1.flag = FALSE;

13  out.arg2.arg2_len = 0;

14  out.arg3 = NULL;

15  buff = Malloc(BUFFSIZE); /* Адрес должен быть кратен четырем */

16  xdrmem_create(&xhandle, buff, BUFFSIZE, XOR_ENCODE);

17  if (xdr_args(&xhandle, &out) != TRUE)

18   err_quit("xdr_args error");

19  size = xdr_getpos(&xhandle);

20  lptr = (long*)buff;

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

22   printf("%ld ", (long) ntohl(*lptr++));

23  exit(0);

24 }

Присваивание значений

12-14 Дискриминанту объединения присваивается значение FALSE, длина массива переменной длины устанавливается в 0, а указатель делается нулевым (NULL).

Выделение буфера и кодирование

15-19 Мы выделяем буфер и кодируем структуру out в поток XDR. 

Вывод содержимого буфера XDR

20-22 Мы выводим содержимое буфера XDR по 4 байта, используя функцию ntohl (host-to-network long integer) для преобразования из порядка XDR big-endian в байтовый порядок узла. В результате получается именно то, что должно было быть помещено в буфер библиотекой XDR времени выполнения:

solaris % opt1z

0

0

0

Как мы и предполагали, каждому аргументу отводится 4 байта со значением О, указывающим на то, что за ним не следует никаких данных.

В листинге 16.20 приведена измененная версия программы, которая присваивает значения всем трем аргументам, кодирует их в поток XDR и выводит его содержимое.

Листинг 16.20. Присваивание значений аргументам из листинга 16.17

//sunrpc/xdr1/opt1.c

1  #include "unpipc.h"

2  #include "opt1.h"

3  int

4  main(int argc, char **argv)

5  {

6   int i;

7   XOR xhandle;

8   char *buff;

9   long lval2, lval3, *lptr;

10  args out;

11  size_t size;

12  out.arg1.flag = TRUE;

13  out.arg1.optlong_u.val = 5;

14  lval2 = 9876;

15  out.arg2.arg2_len = 1;

16  out.arg2.arg2_val = &lval2;

17  lval3 = 123;

18  out.arg3 = &lval3;

19  buff = Malloc(BUFFSIZE); /* адрес должен быть кратен 4 */

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

21  if (xdr_args(&xhandle, &out) != TRUE)

22   err_quit("xdr_args error");

23  size = xdr_getpos(&xhandle);

24  lptr = (long *) buff;

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

26   printf("%ld ", (long) ntohl(*lptr++));

27  exit(0);

28 }

Присваивание значений

12-18 Для присваивания значения объединению мы устанавливаем дискриминант в TRUE, а затем присваиваем значение полю long. Длину массива мы также сначала устанавливаем в 1. Указатель мы устанавливаем на соответствующее значение в памяти.

При запуске этой программы мы получим ожидаемые шесть 4-байтовых значений:

solaris % opt1

1 значение дискриминанта TRUE

5

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

9876

1 флаг для ненулевого указателя

123

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.3 Программы и данные

Из книги Пакеты программ. Требования к качеству и тестирование автора Автор неизвестен

3.3 Программы и данные 3.3.1 Функциональные возможности a) Установка (инсталляция)Если установка пакета может быть выполнена пользователем, то при ее проведении должна быть обеспечена возможность успешной установки программ в соответствии с информацией, содержащейся в


4.2.3 Программы и данные

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

4.2.3 Программы и данные Должно быть протестировано выполнение соответствующих требований раздела 3, а выполнение рекомендаций раздела 3 может быть протестировано.Программы должны быть протестированы во всех вычислительных системах, указанных в описании продукта.При


А.3 Данные

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

А.3 Данные А.3.1 данные (data): Представление информации в формализованном виде, пригодном для передачи, интерпретации или обработки (ИСО/МЭК 2382-1 [30], без примечаний).А.3.2 носитель данных (data medium): Материал, в котором или на котором данные могут быть записаны и с которого они могут


Необязательные ресурсы компоновочного блока

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Необязательные ресурсы компоновочного блока Наконец, компоновочный блок .NET может содержать любой набор встроенных ресурсов, таких как, например, пиктограммы приложении, графические файлы, звуковые фрагменты или таблицы строк. Платформа .NET обеспечивает поддержку


Логические данные

Из книги Наглядный самоучитель работы на нетбуке автора Сенкевич Г. Е.

Логические данные Логические данные предназначены для выполнения операций сравнения, а также для использования в условных операторах. При этом логические данные имеют только два значения: true (истина) и false (ложь). Отметим, что в JScript эти значения никак не соотносятся с


10.2.4 Срочные данные

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

10.2.4 Срочные данные Модель пересылки данных приложением предполагает применение упорядоченного потока байтов, следующего к точке назначения. Снова обратившись к примеру интерактивного сеанса, предположим, что пользователь нажал клавишу attention (внимание) или break


12.12 Данные DNS

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

12.12 Данные DNS Для сервера DNS требуется, по крайней мере, следующая информация:? Список корневых серверов всего мира, чтобы выяснить, куда посылать внешние запросы. Файл такого списка можно скопировать с сервера регистрации InterNIC.? Список имен и соответствующих им


Где хранятся данные?

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Где хранятся данные? В оперативной памяти информация находится временно, только пока нетбук включен.Постоянно же все данные хранятся на жестком диске (винчестере). Внутри винчестера информация очень плотно записывается на вращающиеся магнитные пластины. Записывают и


Данные потока

Из книги C++ для начинающих автора Липпман Стенли

Данные потока В реальном коде часто возникает ситуация, когда одновременно исполняются несколько экземпляров потоков, использующих один и тот же код (при создании потоков указывается одна и та же функция потока). При этом некоторые данные (например, статические объекты,


Необязательные элементы

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Необязательные элементы UNIQUEКлючевое слово UNIQUE может быть использовано в индексах, для которых вы хотите запретить дублирующие записи. Столбец или группа проверяется на дублированные значения, когда индекс создается, а также для существующих значений каждый раз, когда


Глава 30. Необязательные параметры (ключи)

Из книги автора

Глава 30. Необязательные параметры (ключи) Необязательные параметры -- это дополнительные ключи (опции), которые оказывают влияние на поведение сценария и/или командной оболочки.Команда set позволяет задавать дополнительные опции прямо внутри сценария. В том месте


13.1.1. Данные-члены

Из книги автора

13.1.1. Данные-члены Данные-члены класса объявляются так же, как переменные. Например, у класса Screen могут быть следующие данные-члены:#includeclass Screen {string _screen; // string( _height * _width )string::size_type _cursor; // текущее положение на экранеshort _height; // число строкshort _width; //


Материальные данные

Из книги автора

Материальные данные Данные об анализанте и самом тексте являются лишь вспомогательными. Они могут более или менее сильно повлиять на оценку признаков почерка, даваемую экспертами.Например, если почерк оказывается неровным, дрожащим и при этом известно, что автору более


23.5. Неупорядоченные данные

Из книги автора

23.5. Неупорядоченные данные В обычном режиме SCTP обеспечивает надежную упорядоченную доставку данных. Кроме того, SCTP предоставляет и сервис надежной неупорядоченной доставки. Сообщение с флагом MSG_UNORDERED отправляется вне очереди и делается доступным для чтения сразу же