Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Два целочисленных значения, на которые указывают аргументы

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

31.5. Функция ioctl

Говоря о потоках, мы снова возвращаемся к функции

ioctl
, которая уже была описана в главе 17.

#include <stropts.h>

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

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

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

Существует примерно 30 запросов (

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

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

На рис. 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);

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

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);

  • Читать дальше
  • 1
  • ...
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • 459
  • 460
  • 461
  • 462
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: