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

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

Жанры

Шрифт:

Для определения адреса TLI предоставляет общую структуру данных

netbuf
, имеющую вид:

struct netbuf {

 unsigned int maxlen;

 unsigned int len;

 char *buf;

}

Поле

buf
указывает на буфер, в котором может передаваться адрес узла,
maxlen
определяет его размер, a
len
— количество данных в буфере, т.е. размер адреса. Эта структура по своему назначению похожа на структуру
sockaddr
, которая является общим определением адреса коммуникационного узла для сокетов. Далее рассматривается пример сетевого приложения, основанного на TLI, где показано, как
netbuf
используется при передаче адреса для протоколов TCP/IP.

Структура

netbuf
используется в TLI для хранения не только адреса, но и другой информации — опций протокола и прикладных
данных. Эта структура является составной частью более сложных структур данных, используемых при передаче параметров в функциях TLI. Для упрощения динамического размещения этих структур библиотека TLI предоставляет две функции: t_alloc(3N) для размещения структуры и t_free(3N) для освобождения памяти. Эти функции имеют следующий вид:

#include <tiuser.h>

char *t_alloc(int fd, int struct_type, int fields);

int t_free(char *ptr, int struct_type);

Аргумент

struct_type
определяет, для какой структуры данных выделяется память. Он может принимать следующие значения:

Значение поля struct_type Структура данных
T_BIND
struct t_bind
T_CALL
struct t_call
T_DIS
struct t_discon
T_INFO
struct t_info
T_OPTMGMT
struct t_optmgmt
T_UNITDATA
struct t_unitdata
T_UDERROR
struct t_uderr

Co структурами, приведенными в таблице, мы познакомимся при обсуждении функций TLI. Большинство из них включают несколько элементов

netbuf
. Поскольку в некоторых случаях может отсутствовать необходимость размещения всех элементов
netfuf
, поле
fields
позволяет указать, какие конкретно буферы необходимо разместить для данной структуры:

Значение поля fields Размещаемые и инициализируемые поля
T_ALL
Все необходимые поля
T_ADDR
Поле
addr
в структурах
t_bind
,
t_call
,
t_unitdata
,
t_uderr
T_OPT
Поле
opt
в структурах
t_call
,
t_unitdata
,
t_uderr
,
t_optmgmt
T_UDATA
Поле
udata
в структурах
t_call
,
t_unitdata
,
t_discon

Отметим одну особенность. Фактический размер буфера и, соответственно, структуры

netbuf
зависят от значения поля
maxlen
этой структуры. В свою очередь, этот параметр зависит от конкретного поставщика транспортных услуг — именно он определяет максимальный размер адреса, опций и прикладных данных. Чуть позже мы увидим, что эта информация ассоциирована с транспортным узлом и может быть получена после его создания с помощью функции t_open(3N). Поэтому для определения фактического размера размещаемых структур в функции t_аlloc(3N) необходим аргумент
fd
, являющийся дескриптором транспортного узла, который возвращается процессу функцией t_open(3N).

Перейдем к основным функциям TLI.

Как видно из рис. 6.18 и 6.19, в качестве первого этапа создания коммуникационного узла используется функция t_open(3N). Как и системный вызов open(2), она возвращает дескриптор, который в дальнейшем адресует узел в функциях TLI. Функция имеет вид:

#include <tiuser.h>

#include <fcitl.h>

int t_open(const char *path, int oflags, struct t_info *info);

Аргумент

path
является именем специального файла устройства, являющегося поставщиком транспортных услуг, например, /dev/tcp или /dev/udp. Аргумент
oflags
определяет флаги открытия файла и соответствует аналогичному аргументу системного вызова open(2). Приложение может получить информацию о поставщике транспортных услуг в структуре
info
, имеющей следующие поля:

addr
Определяет максимальный размер адреса транспортного протокола. Значение -1 говорит, что размер не ограничен, -2 означает, что прикладная программа не имеет доступа к адресам протокола. Протокол TCP устанавливает размер этого адреса (адрес порта) равным 16.
options
Определяет размер опций для данного протокола. Значение -1 свидетельствует, что размер не ограничен, -2 означает, что прикладная программа не имеет возможности устанавливать опции протокола.
tsdu
Определяет максимальный размер пакета данных протокола (Transport Service Data Unit, TSDU). Нулевое значение означает, что протокол не поддерживает пакетную передачу (т.е. не сохраняет границы записей). Значение -1 свидетельствует, что размер не ограничен, -2 означает, что передача обычных данных не поддерживается. Поскольку протокол TCP обеспечивает передачу неструктурированного потока данных, значение
tsdu
для него равно 0. Напротив, UDP поддерживает пакетную передачу.
etsdu
Определяет максимальный размер пакета экстренных данных протокола (Expedited Transport Service Data Unit, ETSDU). Нулевое значение означает, что протокол не поддерживает пакетную передачу (т.е. не сохраняет границы записей). Значение -1 свидетельствует, что размер не ограничен, -2 означает, что передача экстренных данных не поддерживается. TCP обеспечивает такую поддержку, а UDP — нет.
connect
Некоторые протоколы допускают передачу прикладных данных вместе с запросом на соединение. Поле connect определяет максимальный размер таких данных. Значение -1 свидетельствует, что размер не ограничен, -2 означает, что данная возможность не поддерживается. И TCP и UDP не поддерживают этой возможности.
discon
Определяет то же, что и
connect
, но при запросе на прекращение соединения. И TCP и UDP не поддерживают этой возможности.
servtype
Определяет тип транспортных услуг, предоставляемых протоколом. Значение
T_COTS
означает передачу с предварительным установлением соединения,
T_COTS_ORD
— упорядоченную передачу с предварительным установлением соединения,
T_CLTS
— передачу без предварительного установления соединения. Протокол TCP обеспечивает услугу
T_COTS_ORD
, a UDP —
T_CLTS
.

Прежде чем передача данных будет возможна, транспортному узлу должен быть присвоен адрес. Эта фаза называется операцией связывания и мы уже сталкивались с ней при разговоре о сокетах в главе 3 и при обсуждении сетевой поддержки в BSD UNIX ранее в этой главе. В рассмотренных случаях связывание выполнял вызов bind(2). В TLI для этого служит функция t_bind(3N), имеющая вид:

#include <tiuser.h>

int t_bind(int fd, const struct t_bind *req,

 struct t_bind *ret);

Аргумент

fd
адресует коммуникационный узел. Аргумент
req
позволяет программе явно указать требуемый адрес, а через аргумент
ret
возвращается значение, установленное протоколом.

Два последних аргумента описываются структурой

t_bind
, имеющей следующие поля:

struct netbuf addr
Адрес
unsigned qlen
Максимальное число запросов на установление связи, которые могут ожидать обработки. Имеет смысл только для протоколов с предварительным установлением соединения

Рассмотрим три возможных формата аргумента

req
:

req == NULL
Позволяет поставщику транспортных услуг самому выбрать подходящий адрес
req != NULL req->addr.len == 0
Позволяет поставщику транспортных услуг самому брать подходящий адрес, но определяет максимальное число запросов на установление связи, которые могут ожидать обработки
req != NULL req->addr.len > 0
Явно указывает требуемый адрес и максимальное число запросов на установление связи, которые могут ожидать обработки
Поделиться:
Популярные книги

Эйгор. В потёмках

Кронос Александр
1. Эйгор
Фантастика:
боевая фантастика
7.00
рейтинг книги
Эйгор. В потёмках

Темный Патриарх Светлого Рода 5

Лисицин Евгений
5. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 5

Всплеск в тишине

Распопов Дмитрий Викторович
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Всплеск в тишине

Дикая фиалка Юга

Шах Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Дикая фиалка Юга

Неудержимый. Книга IV

Боярский Андрей
4. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IV

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Титан империи 2

Артемов Александр Александрович
2. Титан Империи
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Титан империи 2

Я – Орк. Том 2

Лисицин Евгений
2. Я — Орк
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 2

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Системный Нуб 2

Тактарин Ринат
2. Ловец душ
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Системный Нуб 2

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин