Чтение онлайн

на главную - закладки

Жанры

UNIX: разработка сетевых приложений
Шрифт:

Существует примерно 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);

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

12 bzero(&myaddr, sizeof(myaddr));

13 myaddr.sin_family = AF_INET;

14 myaddr.sin_addr.s_addr = htonl(INADDR_ANY);

15 myaddr.sin_port = htons(0);

16 tpi_bind(fd, &myaddr, sizeof(struct sockaddr_in));

17 /* заполняем адрес сервера */

18 bzero(&servaddr, sizeof(servaddr));

19 servaddr.sin_family = AF_INET;

20 servaddr.sin_port = htons(13); /* сервер времени и даты */

21 Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

22 tpi_connect(fd, &servaddr, sizeof(struct sockaddr_in));

23 for (;;) {

24 if ((n = tpi_read(fd, recvline, MAXLINE)) <= 0) {

25 if (n == 0)

26 break;

27 else

28 err_sys("tpi_read error");

29 }

30 recvline[n] = 0; /* завершающий нуль */

31 fputs(recvline, stdout);

32 }

33 tpi_close(fd);

34 exit(0);

35 }

Открытие транспортного устройства, связывание локального адреса

10-16
Мы открываем устройство, соответствующее поставщику транспортных служб (обычно
/dev/tcp
). Мы заполняем структуру адреса сокета Интернета значениями
INADDR_ANY
и 0 (для порта), указывая тем самым TCP связать произвольный локальный адрес с нашей точкой доступа. Мы вызываем свою собственную функцию
tpi_bind
(которая будет приведена чуть ниже) для выполнения этого связывания.

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

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Совершенно несекретно

Иванов Дмитрий
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совершенно несекретно

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Единственная для темного эльфа 3

Мазарин Ан
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Единственная для темного эльфа 3

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита