Пример: вычисление размера буфера

Пример: вычисление размера буфера

В предыдущем примере мы выделяли буфер размера BUFFSIZE (определенного в файле unpiрс.h в листинге В.1), и этого было достаточно. К сожалению, не существует простого способа вычислить объем памяти, нужный XDR для кодирования конкретных данных. Вычислить размер структуры вызовом sizeof недостаточно, потому что каждое поле кодируется XDR по отдельности. Нам придется перебирать элементы структуры, прибавляя к конечному результату объем памяти, нужный XDR для кодирования очередного элемента. В листинге 16.15 приведен пример простой структуры с тремя полями.

Листинг 16.15. Спецификация XDR для простой структуры

//sunrpc/xdrl/examplе.х

1 const MAXC = 4;

2 struct example {

3  short a;

4  double b;

5  short c[MAXC];

6 };

Программа, текст которой приведен в листинге 16.16, вычисляет размер буфера, требуемого XDR для кодирования этой структуры. Он получается равным 28 байт.

Листинг 16.16. Программа, вычисляющая размер буфера XDR

//sunrpc/xdr1/example.c

1  #include "unpipc.h"

2  #include "example.h"

3  int

4  main(int argc, char **argv)

5  {

6   int size;

7   example foo;

8   size = RNDUP(sizeof(foo.a)) + RNDUP(sizeof(foo.b)) +

9    RNDUP(sizeof(foo.c[0])) * MAXC;

10  printf("size = %d ", size);

11  exit(0);

12 }

8-9 Макрос RNDUP определен в файле <rpc/xdr.h>. Он округляет аргумент к ближайшему кратному BYTES_PER_XDR_UNIT (4). Для массива фиксированного размера вычисляется размер каждого элемента, который затем умножается на количество элементов.

Проблема возникает в случае использования типов данных переменной длины. Если мы объявим stringd<10>, максимальный размер будет RNDUP(sizeof( int)) (для длины) плюс RNDUP(sizeof(char)*10) (для символов строки). Но мы не можем вычислить размер буфера, если максимальный размер не указан в объявлении переменной (например, float e<>). Лучше всего в этом случае выделять буфер с запасом, а потом проверять, не возвращают ли подпрограммы XDR ошибку (упражнение 16.5).

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

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

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

3.1 ЗАГОЛОВКИ БУФЕРА

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

3.1 ЗАГОЛОВКИ БУФЕРА Во время инициализации системы ядро выделяет место под совокупность буферов, потребность в которых определяется в зависимости от размера памяти и производительности системы. Каждый буфер состоит из двух частей: области памяти, в которой хранится


12.3.3.1 Выделение буфера

Из книги Защита вашего компьютера автора Яремчук Сергей Акимович

12.3.3.1 Выделение буфера Обратимся еще раз к алгоритму getblk, рассмотренному нами в главе 3. Алгоритм работает с тремя структурами данных: заголовком буфера, хеш-очередью буферов и списком свободных буферов. Ядро связывает семафор со всеми экземплярами каждой структуры.


Переполнение буфера

Из книги Советы по Delphi. Версия 1.0.6 автора Озеров Валентин

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


Просмотр буфера обмена

Из книги AutoCAD 2009. Начали! автора Соколова Татьяна Юрьевна

Просмотр буфера обмена Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.unit ClipboardViewer;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(tform) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject);private FNextViewerHandle : THandle; procedure WMDrawClipboard(var message: TMessage);


Пример. Простановка горизонтального размера

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Пример. Простановка горизонтального размера Проставьте горизонтальный размер прямоугольника, например, как изображено на рис. 10.8.Запустите команду DIMLINEAR, вызвав ее из меню Dimension ? Linear или щелчком на пиктограмме Linear на панели инструментов Dimension. Ответьте на


Пример. Простановка параллельного размера

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Пример. Простановка параллельного размера Проставьте размер, параллельный измеряемой линии объекта (рис. 10.9).Запустите команду DIMALIGNED, вызвав ее из меню Dimension ? Aligned или щелчком на пиктограмме Aligned на панели инструментов Dimension. Ответьте на запросы:_DIMALIGNEDSpecify first extension line origin or


Пример. Простановка углового размера

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

Пример. Простановка углового размера Проставьте два варианта углового размера, как на рис. 10.13.Запустите команду DIMANGULAR, вызвав ее из падающего меню Dimension ? Angular или щелчком на пиктограмме Angular на панели инструментов Dimension. Ответьте на запросы:_DIMANGULARSelect arc, circle, line, or <specify


14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf

Из книги BPwin и Erwin. CASE-средства для разработки информационных систем автора Маклаков Сергей Владимирович

14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf В главе 11 пара fetchmail/fetchmailconf рассматривалась как пример одного из способов отделения реализации от интерфейса. Преимущества Python хорошо иллюстрируются на примере утилиты fetchmailconfВ программе fetchmailconf используется


14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf В главе 11 пара fetchmail/fetchmailconf рассматривалась как пример одного из способов отделения реализации от интерфейса. Преимущества Python хорошо иллюстрируются на примере утилиты fetchmailconf.В программе fetchmailconf используется


6.20.2 Использование буфера

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

6.20.2 Использование буфера Протокол IP, производящий пересылку датаграммы, несет ответственность за ее доставку. Для тех случаев, когда датаграмма по тем или иным причинам не попала в точку назначения, предусмотрен буфер датаграмм, позволяющий произвести операцию


2.3.9. Вычисление размера БД

Из книги Защита от хакеров корпоративных сетей автора Автор неизвестен

2.3.9. Вычисление размера БД ERwin позволяет рассчитать приблизительный размер БД в целом, а также таблиц, индексов и других объектов через определенный период времени после начала эксплуатации ИС. Для расчета размеров физических объектов служит диалог Volumetrics Editor (рис. 2.99),


Вычисление размера кэша

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Вычисление размера кэша Когда Firebird читает страницу базы данных с диска, он сохраняет эту страницу в кэше. Обычно размер кэша по умолчанию является достаточным. Если ваше приложение использует соединения из пяти и более таблиц, Firebird Суперсервер может автоматически


Пример программы, уязвимой к переполнению буфера

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

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


14.2. Переполнение буфера

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

14.2. Переполнение буфера Это одна из самых популярных и в то же время наиболее сложная в использовании уязвимость. Для начала определимся, почему программисты допускают такие ошибки, при которых возможно выполнить переполнение буфера?В таких языках, как С++, для работы с


10.6.1. Переполнение буфера

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

10.6.1. Переполнение буфера Почти псе основные Internet-демоны, включая демоны таких программ, как sendmail, finger, talk и др., подвержены атакам типа переполнение буфера. О них следует обязательно помнить при написании программ, которые должны выполняться с правами пользователя root, а