А. Робачевский - Операционная система UNIX (1114671), страница 81
Текст из файла (страница 81)
ТЫ не накладывает никаких огра!ничений на формат адреса, возлагаяинтерпретацию на протоколынижнего уровня. Благодаря этому, один и тот же интерфейс может бытьиспользован при работе с различными семействами сетевых протоколов.www.books-shop.com427Программные интерфейсыДля определения адреса ТЫ предоставляет общую структуру данныхnetbuf, имеющую вид:struct netbuf {unsigned int maxlen;unsigned int len;char}Рис. 6.18. Схема вызова функций TLI для протокола с предварительным установ%лением соединенияПоле buf указывает на буфер, в котором может передаваться адрес узла,maxlen определяет его размер, a len — количество данных в буфере, т.
е.размер адреса. Эта структура по своему назначению похожа на структуруsockaddr, которая является общим определением адреса коммуникацион!ного узла дляДалее рассматривается пример сетевого приложе!www.books-shop.comГлава 6.428сети в операционнойUNIXния, основанного на ТЫ, где показано, как netbuf используется при пе!редаче адреса для протоколов TCP/IP.Рис. 6.19. Схема вызова функций TLI для протокола без предварительногоустановления соединенияСтруктура netbuf используется в ТЫ для хранения не только адреса, но идругой информации — опций протокола и прикладных данных. Эта струк!тура является составной частью более сложных структур данных, исполь!зуемых при передаче параметров в функциях ТЫ. Для упрощения дина!мического размещения этих структур библиотека ТЫ предоставляет двефункции:для размещения структуры идля освобож!дения памяти.
Эти функции имеют следующий вид:charintfd, int*ptr, intint f i e l d s ) ;Аргумент struct_type определяет, для какой структуры данных выделя!ется память. Он может принимать следующие значения:www.books-shop.comПрограммные интерфейсы429Значение поля struct_typeСтруктура данныхT_BINDstruct t_bindT_CALLstruct t_callT_DISstruct t_disconT_INFOstruct t_infostructstruct t_unitdataT_UDERRORstruct t_uderrCo структурами, приведенными в таблице, мы познакомимся при обсуж!дении функций ТЫ.
Большинство из них включают несколько элементовПоскольку в некоторых случаях может отсутствовать необходи!мость размещения всех элементовполе f i e l d s позволяет указать,какие конкретно буферы необходимо разместить для данной структуры:Значение поля fieldsРазмещаемые и инициализируемые поляВсе необходимые поляT_ADDRПоле addr В структурах t_bind, t_call, t_unitdata,t_uderrПоле opt в структурах t_call,Полеudataвструктурахt_uderr,t_call,t_unitdata,Отметим одну особенность. Фактический размер буфера и, соответствен!но, структуры netbuf зависят от значения поля maxlen этой структуры.
Всвою очередь, этот параметр зависит от конкретного поставщика транс!портных услуг — именно он определяет максимальный размер адреса, оп!ций и прикладных данных. Чуть позже мы увидим, что эта информацияассоциирована с транспортным узлом и может быть получена после егосоздания с помощью функцииПоэтому для определения фак!тического размера размещаемых структур в функциинеобходимаргумент d, являющийся дескриптором транспортного узла, который воз!вращается процессу функциейПерейдем к основным функциям ТЫ.Как видно из рис. 6.18 ив качестве первого этапа создания коммуни!кационного узла используется функцияКак и системный вы!зовона возвращает дескриптор, который в дальнейшем адресуетузел в функциях ТЫ.
Функция имеет вид:int<tiuser.h><fcntl.h>charintstructȾɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com430Глава 6.сети в операционнойUNIXАргумент path является именем специального файла устройства, являю!щегося поставщиком транспортных услуг, например, /dev/tcp илиАргумент of lags определяет флаги открытия файла и соответст!вует аналогичному аргументу системного вызова ореп(2). Приложение мо!жет получить информацию о поставщике транспортных услуг в структуреinfo, имеющей следующие поля:addrОпределяет максимальный размер адреса транспортного протоко%ла. Значение %1 говорит, что размер не ограничен, %2 означает, чтоприкладная программа не имеет доступа к адресам протокола.Протокол TCP устанавливает размер этого адреса (адрес порта)равнымoptionsОпределяет размер опций для данного протокола.
Значение %1свидетельствует, что размер не ограничен, %2 означает, что при%кладная программа не имеет возможности устанавливать опциипротокола.Определяет максимальный размер пакета данных протокола(Transport Service Data Unit, TSDU). Нулевое значение означает, чтопротокол не поддерживает пакетную передачу (т. е. не сохраняетграницы записей). Значение %1 свидетельствует, что размер не ог%раничен, %2 означает, что передача обычных данных не поддержи%вается.
Поскольку протокол TCP обеспечивает передачу неструкту%рированного потока данных, значение tsdu для него равно 0. На%против, UDP поддерживает пакетную передачу.Определяет максимальный размер пакета экстренных данных про%токола (Expedited Transport Service Data Unit, ETSDU). Нулевое зна%чение означает, что протокол не поддерживает пакетную передачу(т. е.
не сохраняет границы записей). Значение %1 свидетельствует,что размер не ограничен, %2 означает, что передача экстренныхданных не поддерживается. TCP обеспечивает такую поддержку, аUDP % нет.connectНекоторые протоколы допускают передачу прикладных данныхвместе с запросом на соединение. Поле connect определяет мак%симальный размер таких данных.
Значение %1 свидетельствует, чторазмер не ограничен, %2 означает, что данная возможность не под%держивается. И TCP и UDP не поддерживают этой возможности.disconОпределяет то же, что и connect, но при запросе на прекращениесоединения. И TCP и UDP не поддерживают этой возможности.servtypeОпределяет тип транспортных услуг, предоставляемых протоколом.Значениеозначает передачу с предварительным установ%лением соединения, T_COTS_ORD — упорядоченную передачу спредварительным установлением соединения,— передачубез предварительного установления соединения. Протокол TCPобеспечивает услугу T_COTS_ORD, a UDP — т CLTS.www.books-shop.comПрограммные интерфейсыПрежде чем передача данных будет возможна, транспортному узлу долженбыть присвоен адрес.
Эта фаза называется операцией связывания и мы ужесталкивались с ней при разговоре ов главе 3 и при обсуждениисетевой поддержки в BSD UNIX ранее в этой главе. В рассмотренных слу!чаях связывание выполнял вызовВ ТЫ для этого служит функцияимеющая вид:intconst struct t_bind *req,struct t_bindАргумент fd адресует коммуникационный узел. Аргумент req позволяетпрограмме явно указать требуемый адрес, а через аргумент ret возвраща!ется значение, установленное протоколом.Два последних аргумента описываются структурой t_bind, имеющей сле!дующие поля:structunsignedaddrАдресМаксимальное число запросов на установление связи, ко%торые могут ожидать обработки. Имеет смысл только дляпротоколов с предварительным установлением соединенияРассмотрим три возможных формата аргумента req:req == NULLreq != NULL== 0req ! = NULLlen > 0Позволяет поставщику транспортных услуг самому вы%брать подходящий адресПозволяет поставщику транспортных услуг самомубрать подходящий адрес, но определяет максимальноечисло запросов на установление связи, которые могутожидать обработкиЯвно указывает требуемый адрес и максимальное числозапросов на установление связи, которые могут ожидатьобработкиВо всех случаях фактическое значение адреса возвращается в структуреret.
Даже если программа явно указала требуемый адрес, необходимопроверить, совпадает ли он с адресом, указанным в ret.Для протоколов с предварительным установлением соединения програм!ме!клиенту необходимо использовать функциюотправляю!щую запрос на создание соединения с удаленным транспортным узлом.Функцияимеет вид:<tiuser.h>intfd, const struct t_callstruct t_callАргументсодержит информацию, необходимую поставщикутранспортных услуг для создания виртуального канала. Формат этой ин!формации описывается структурой t call, имеющей следующие поля:www.books-shop.com432Глава 6.сети в операционной системе UNIXstruct netbufАдрес удаленного транспортного узлаstruct netbuf optТребуемые опции протоколаstruct netbuf udata Прикладные данные, отправляемые вместе с управляю%щей информацией (запрос на установление соединенияили подтверждение)intsequenceв данном случае не имеет смыслаЧерез аргументпрограмме возвращается информация о виртуаль!ном канале после его создания: адрес удаленного узла, опции и приклад!ные данные, переданные удаленным узлом.
Как уже отмечалось, ни TCP,ни UDP не позволяют передавать данные вместе с управляющей инфор!мацией. Программа может установить значение rcvcall равным NULL,если информация о канале ее не интересует.Обычно возврат из функциипроисходит после окончатель!ного установления соединения, когда виртуальный канал готов к передачеданных (конечно, в случае успешного завершения).Для протоколов с предварительным установлением соединения програм!ма!сервер вызывает функциюблокируя свое выполнение дополучения запроса на создание виртуального канала.#include <tiuser.h>intfd, structИнформация, возвращаемая транспортным протоколом в аргументе call,содержит параметры, переданные удаленным узлом с помощью соответст!вующего вызоваего адрес, установленные опции протокола,а также, в ряде случаев, прикладные данные, переданные вместе с запро!сом.
Поле sequence аргумента call содержит уникальный идентификаторданного запроса.Хотя t_listen(3N), несмотря на название, напоминает функцию accept(2),используемую для сокетов, сервер должен выполнить вызов другой функ!ции —для того, чтобы фактически принять запрос и устано!вить соединение. Функцияимеет вид:ftinclude<tiuser.h>intfd,int connfd,struct t_callАргумент fd адресует транспортный узел, принявший запрос (тот же, чтои для функцииАргумент connfd адресует транспортный узел,для которого будет установлено соединение с удаленным узлом.