Теория и практика программирования на Си в Unix

Фильтры XDR


Как мы уже говорили, фильтры XDR кодируют и декодируют данные, хранящиеся в потоках. Фильтры, таким образом, представляют собой функции, которые реализуют операции перекодировки. Эти функции возвращают TRUE, если операция удалась, и FALSE - в противном случае. Существуют три типа фильтров : базовые фильтры, композитные фильтры и сложные фильтры.

- Базовые фильтры
Эти фильтры хранятся в библиотеке XDR и соответствуют базовым типам языка Си : char,int,long,float,double,void и enum. Эти фильтры имеют следующий формат bool_t xdr_type(xdr_handle, pobj) XDR *xdr_handle; int *pobj; Мы уже рассматривали примеры использования фильтров xdr_int() и xdr_float() для стандартного потока ввода-вывода и потока записей.

- Композитные фильтры
Эти фильтры тоже хранятся в библиотеке XDR и обрабатывают композитные данные : строки, массивы ... Как и в предыдущем случае, два первых аргумента функции - указатель на handle XDR и указатель на объект обрабатываемого типа. Есть и другие ар- гументы, которые зависят от конкретного фильтра.

Композитные фильтры обрабатывают данные следующих типов :
- string : строка символов
- opaque : массив байтов фиксированной длины
- bytes : массив байтов переменной длины
- vector : массив данных какого-либо типа фиксированной длины
- array : массив данных какого-либо типа переменной длины
- union : запись с вариантами - reference : указатели
- pointer : указатели, включая указатель NULL, позволяющий создавать связанные списки.

Что касается типа union, следует заметить, что дискриминант записи является внешним. Это эквивалентно комбинации типов union и enum языка Си.

- Сложные фильтры
Эти фильтры конструируются программистами и представляют собой комбинации фильтров описанных выше типов. Можно, например, сконструировать фильтр для структуры, скомбинировав базовые и композитные фильтры, соответствующие элементам структуры.

Что касается практических приложений,то мы очень советуем Вам использовать для генерации фильтров компилятор RPCGEN, подробно описанный в главе 10 (RPC фирмы Sun). RPCGEN удобно использовать для всех типов данных, потому что он порождает очень простые фильтры, использующие только два параметра - как в случае базовых фильтров.



Содержание раздела