Два целочисленных значения, на которые указывают аргументы bandp
и flagsp
функции getpmsg
, являются аргументами типа «значение-результат». Целочисленное значение, на которое указывает аргумент flagsp
функции getpmsg
, может соответствовать MSG_HIPRI
(для чтения сообщений с высоким приоритетом), MSG_BAND
(для чтения сообщений из полосы приоритета, по меньшей мере равной целочисленному значению, на которое указывает аргумент bandp
) или MSG_ANY
(для чтения любых сообщений). По завершении функции целочисленное значение, на которое указывает аргумент bandp
, указывает на полосу приоритета прочитанного сообщения, а целое число, на которое указывает аргумент flagsp
, соответствует MSG_HIPRI
(если было прочитано сообщение с высоким приоритетом) или MSG_BAND (если было прочитано иное сообщение).
31.5. Функция ioctl
Говоря о потоках, мы снова возвращаемся к функции ioctl
, которая уже была описана в главе 17.
#include
int ioctl(int
Единственным изменением относительно прототипа функции, приведенного в разделе 17.2, является включение заголовочного файла, необходимого для работы с потоками.
Существует примерно 30 запросов (request
), так или иначе влияющих на головной модуль потока. Каждый из запросов начинается с I_
, и обычно документация на них приводится на странице руководства streamio
.
31.6. TPI: интерфейс поставщика транспортных служб
На рис. 31.3 мы показали, что TPI — это интерфейс, предоставляющий доступ к транспортному уровню для расположенных выше уровней. Этот интерфейс используется в потоковой среде как сокетами, так и XTI. Из рис. 31.3 видно, что комбинация библиотеки сокетов и sokmod
, а также комбинация библиотеки XTI и timod
обмениваются сообщениями TPI с TCP и UDP.
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
3 #include
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);
Нам нужно включить еще один дополнительный заголовочный файл помимо
, содержащего определения структур для всех сообщений 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
10 fd = Open(XTI_TCP, O_RDWR, 0);
11 /* связываем произвольный локальный адрес */
12 bzero(&myaddr, sizeof(myaddr));
13 myaddr.sin_family = AF_INET;
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии