Потоки XDR, ввод/вывод и протокол TCP

Опубликовано в Технологии > Серверные технологии Продолжение

В приведенных выше примерах кода создается поток XDR, связанный с буфером в памяти. Применение памяти для буферизации данных позволяет повысить эффективность работы программы, поскольку обеспечивает возможность преобразовывать в приложении во внешнюю форму большие объемы данных перед передачей их по сети. После преобразования элементов данных во внешнюю форму и размещения их в буфере, в приложении необходимо вызвать функцию ввода/вывода, такую как write, для передачи данных через соединение TCP. Выбрать выгодное продвижение сайта в Запорожье.

Кроме того, может применяться способ использования процедур преобразования XDR для автоматической передачи данных через соединение TCP после преобразования каждого элемента данных во внешнюю форму. Для этого в прикладной программе вначале создается сокет TCP, а затем вызывается функция f dopen для закрепления за этим сокетом стандартного потока ввода/вывода. Вместо вызова процедуры xdrmem_create в приложении вызывается процедура xdrstdio_create для создания потока XDR и подключения его к существующему дескриптору ввода/вывода. Потоки XDR, подключенные к сокету TCP, не требуют явного вызова функций write или read. При вызове в приложении каждой процедуры преобразования XDR автоматически выполняется операция буферизированного чтения или записи с использованием соответствующего дескриптора. Запись в поток равносильна требованию к программному обеспечению TCP передать исходящие данные в сокет, а чтение равносильно требованию прочитать входящие данные из сокета. В приложении для работы с потоком ввода/вывода могут также применяться обычные функции из стандартной библиотеки ввода/вывода. Например, если требуется отправить все накопленные данные, в приложении можно вызвать функцию fflush для освобождения буфера вывода после преобразования даже нескольких байтов данных.

20.13. Записи, границы записей и дейтаграммный ввод/вывод

Описанный механизм XDR успешно работает в сочетании со средствами ввода/вывода сокета TCP, поскольку и программное обеспечение XDR, и программное обеспечение TCP основано на понятии потока. Для обеспечения возможности применять средства преобразования XDR в сочетании с протоколом UDP так же успешно, как и с протоколом TCP, был разработан второй интерфейс. В этом альтернативном проекте предусмотрена возможность применять в приложении интерфейс, обеспечивающий прием и передачу данных в виде записей.

Для использования интерфейса обмена данными в виде записей в программе при создании потока XDR вызывается функция xdrrec_create. Этот вызов включает два параметра, inproc и outproc, которые обозначают процедуру ввода и процедуру вывода. При преобразовании данных во внешнюю форму каждая процедура преобразования проверяет буфер. После обнаружения того, что буфер заполнен, процедура преобразования вызывает функцию outproc для вывода содержимого буфера и освобождения места для новых данных. Аналогичным образом, при каждом вызове в приложении процедуры преобразования для декодирования из внешней формы во внутреннее представление процедура проверяет, имеются ли в буфере данные. Если буфер пуст, процедура преобразования вызывает функцию inproc для получения дополнительных данных.

При использовании программного обеспечения XDR в сочетании с программным обеспечением UDP в приложении создается поток XDR, предусматривающий обмен данными в виде записей. В нем обеспечивается вызов в процедурах ввода и вывода функций read и write (или recv и send), связанных с этим потоком. После заполнения в приложении буфера процедура преобразования вызывает функцию write для передачи буфера в виде одной дейтаграммы UDP. Аналогичным образом, при вызове в приложении процедуры преобразования для извлечения данных из буфера, процедура преобразования вызывает функцию read для получения следующей входящей дейтаграммы и размещения ее в буфере.

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