Читаем UNIX: разработка сетевых приложений полностью

Два целочисленных значения, на которые указывают аргументы bandpи flagspфункции getpmsg, являются аргументами типа «значение-результат». Целочисленное значение, на которое указывает аргумент flagspфункции getpmsg, может соответствовать MSG_HIPRI(для чтения сообщений с высоким приоритетом), MSG_BAND(для чтения сообщений из полосы приоритета, по меньшей мере равной целочисленному значению, на которое указывает аргумент bandp) или MSG_ANY(для чтения любых сообщений). По завершении функции целочисленное значение, на которое указывает аргумент bandp, указывает на полосу приоритета прочитанного сообщения, а целое число, на которое указывает аргумент flagsp, соответствует MSG_HIPRI(если было прочитано сообщение с высоким приоритетом) или MSG_BAND (если было прочитано иное сообщение).

<p>31.5. Функция ioctl</p>

Говоря о потоках, мы снова возвращаемся к функции ioctl, которая уже была описана в главе 17.

#include stropts.h

int ioctl(int fd, int request, ... /* void * arg*/ );

Возвращает: 0 в случае успешного выполнения, -1 в случае ошибки

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

Существует примерно 30 запросов ( request), так или иначе влияющих на головной модуль потока. Каждый из запросов начинается с I_, и обычно документация на них приводится на странице руководства streamio.

<p>31.6. TPI: интерфейс поставщика транспортных служб</p>

На рис. 31.3 мы показали, что TPI — это интерфейс, предоставляющий доступ к транспортному уровню для расположенных выше уровней. Этот интерфейс используется в потоковой среде как сокетами, так и XTI. Из рис. 31.3 видно, что комбинация библиотеки сокетов и sokmod, а также комбинация библиотеки XTI и timodобмениваются сообщениями TPI с TCP и UDP.

TPI является интерфейсом, основанным на сообщениях( message-based). Он определяет сообщения, которыми обменивается приложение (например, XTI или библиотека сокетов) и транспортный уровень. Точнее, TPI задает формат этих сообщений и то, какое действие производит каждое из сообщений. Во многих случаях приложение посылает запрос поставщику (например, «Связать данный локальный адрес»), а поставщик посылает обратно ответ («Выполнено» или «Ошибка»). Некоторые события, происходящие асинхронно на стороне поставщика (например, прибытие запроса на соединение с сервером), инициируют отправку сигнала или сообщения вверх по потоку.

Мы можем обойти как XTI, так и сокеты, и использовать непосредственно TPI. В этом разделе мы заново перепишем код нашего простого клиента времени и даты с использованием TPI вместо сокетов (сокетная версия представлена в листинге 1.1). Если провести аналогию с языками программирования, то использование XTI или сокетов можно сравнить с программированием на языках высокого уровня, таких как С или Pascal, а непосредственно TPI — с программированием на ассемблере. Мы не являемся сторонниками непосредственного использования TPI в реальной жизни. Но понимание того, как работает TPI, и написание примера с использованием этого протокола позволит нам глубже понять, как работает библиотека сокетов в потоковой среде.

В листинге 31.1 [1]показан наш заголовочный файл tpi_daytime.h.

Листинг 31.1. Наш заголовочный файл tpi_daytime.h

//streams/tpi_daytime.h

 1 #include "unpxti.h"

 2 #include sys/stream.h

 3 #include sys/tihdr.h

 4 void tpi_bind(int, const void*, size_t);

 5 void tpi_connect(int, const void*, size_t);

 6 ssize_t tpi_read(int, void*, size_t);

 7 void tpi_close(int);

Нам нужно включить еще один дополнительный заголовочный файл помимо sys/tihdr.h, содержащего определения структур для всех сообщений TPI.

Листинг 31.2. Функция main для нашего клиента времени и даты с использованием TPI

//streams/tpi_daytime.c

 1 #include "tpi_daytime.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int fd, n;

 6  char recvline[MAXLINE + 1];

 7  struct sockaddr_in myaddr, servaddr;

 8  if (argc != 2)

 9   err_quit("usage: tpi_daytime Ipaddress");

10  fd = Open(XTI_TCP, O_RDWR, 0);

11  /* связываем произвольный локальный адрес */

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT