Последовательная сборка сообщения
Для применения средств преобразования XDR по принципу использования буфера необходимо распределить в программе буфер, достаточно большой для того, чтобы в нем можно было поместить внешнее представление сообщения и последовательно добавлять к нему элементы данных (т.е. поля). Например, в операционной системе Linux предусмотрена версия программного обеспечения XDR, предоставляющая процедуры преобразования, каждая из которых добавляет внешнее представление элемента данных к концу буфера в памяти. Программа вначале вызывает процедуру xdrmem_create для распределения буфера в памяти и передачи программному обеспечению XDR информации о том, что перед ним стоит задача составить в этом буфере внешнее представление сообщения. Процедура xdrmem_create инициализирует область памяти таким образом, чтобы эта область представляла поток данных XDR, который может использоваться для кодирования (преобразования в стандартное представление) или декодирования (преобразования во внутреннее представление) передаваемых или принимаемых данных. В результате этого вызова поток XDR инициализируется как пустой путем установки внутреннего указателя равным адресу начала буфера. Процедура xdrmem_create возвращает указатель потока, который должен затем применяться при последующих вызовах процедур XDR. Ниже приведены примеры объявлений и вызовов, необходимых для создания потока XDR в программе на языке С:
include tdefine BUFSIZE 4000 /* Размер области памяти, в которой */ /* будет выполняться кодирование */ XDR *xdrs; /* Указатель на "поток" XDR */ char buf[BUFSIZE]; /* Область памяти для хранения данных XDR */ xdrmem_create(xdrs, buf, BUFSIZE, XDR_ENCODE);
После создания потока XDR в программе можно вызывать отдельные процедуры преобразования XDR для представления внутренних объектов данных во внешней форме. При каждом вызове таких процедур кодируется один объект данных, и закодированная информация присоединяется к концу потока (т.е. закодированные данные размещаются в следующем доступном участке буфера, после чего внутренний указатель потока обновляется). Например, процедура xdr_int преобразует 32-битовое двоичное целое число из внутреннего представления в стандартное представление XDR и присоединяет его к потоку XDR. В программе процедура xdr_int вызывается путем передачи ей указателя на поток XDR и указателя на целое число:
int i; /* Целое число во внутреннем представлении */ ... /* Предполагается, что поток инициализируется для */ /* работы в режиме XDR_ENCODE */ i = 260; /* Переменной присваивается преобразуемое */ /* целочисленное значение */ xdr_int(xdrs, &i); /* Целое число преобразуется и */ /* присоединяется к потоку */
На рис. 20.2 показано, как в результате выполнения вызова процедуры xdr_int, приведенного в примере кода, к потоку XDR добавляются четыре байта данных. продать недвижимость в Воронеже.
