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 . |