Операционная система UNIX
Шрифт:
Аргумент
| Значение поля 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. Большинство из них включают несколько элементов
| Значение поля 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 |
Отметим одну особенность. Фактический размер буфера и, соответственно, структуры
Перейдем к основным функциям TLI.
Как видно из рис. 6.18 и 6.19, в качестве первого этапа создания коммуникационного узла используется функция t_open(3N). Как и системный вызов open(2), она возвращает дескриптор, который в дальнейшем адресует узел в функциях TLI. Функция имеет вид:
Аргумент
| 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), имеющая вид:
Аргумент
Два последних аргумента описываются структурой
| struct netbuf addr | Адрес |
| unsigned qlen | Максимальное число запросов на установление связи, которые могут ожидать обработки. Имеет смысл только для протоколов с предварительным установлением соединения |
Рассмотрим три возможных формата аргумента
| req == NULL | Позволяет поставщику транспортных услуг самому выбрать подходящий адрес |
| req != NULL req->addr.len == 0 | Позволяет поставщику транспортных услуг самому брать подходящий адрес, но определяет максимальное число запросов на установление связи, которые могут ожидать обработки |
| req != NULL req->addr.len > 0 | Явно указывает требуемый адрес и максимальное число запросов на установление связи, которые могут ожидать обработки |
Во всех случаях фактическое значение адреса возвращается в структуре
Для протоколов с предварительным установлением соединения программе-клиенту необходимо использовать функцию t_connect(3N), отправляющую запрос на создание соединения с удаленным транспортным узлом. Функция t_connect(3N) имеет вид:
Аргумент
| struct netbuf addr | Адрес удаленного транспортного узла |
| struct netbuf opt | Требуемые опции протокола |
| struct netbuf udata | Прикладные данные, отправляемые вместе с управляющей информацией (запрос на установление соединения или подтверждение) |
| int sequence | В данном случае не имеет смысла |
Через аргумент
Обычно возврат из функции t_connect(3N) происходит после окончательного установления соединения, когда виртуальный канал готов к передаче данных (конечно, в случае успешного завершения).