В. Столлингс - Современные компьютерные сети (2-е издание, 2003) (1114681), страница 164
Текст из файла (страница 164)
В этой структуре содержится информация об ивтенах хоста, его псевдонимах и 1Р-адресах. Эти данные получаются из 1)ЫЯ или из локальной базы данных. Функция деЬевйупап)е() определяет номер порта, ассоциированный со службой, имя которой указывается в качестве аргумента. Если вместо него указывается численное значение, оно напрямую преобразуется в двоичное значение и используется как номер порта.
Обратите внимание на то, что список Ь аббт 1)вб содержит 1Р-адреса, ассоциированные с хостом: //1(бе/ И1И //тлс1ибе <нтпбоыз,П> // для всех функций И1пзосд //епб1 Г (/)/бе( ВВР //1пс1ибе «пеббЬ.П> // для структуры Позтепт 1)епб1Г зггист Поз(опт Яреббозгоупаае(сопят сПаг >Поз(пате); Для обнаружения хостов, служб, протоколов или сетей могут использоваться следующие функции: дебреегпатеО, дебйодбЬудббгО, дебрю)Ьупал)еО, дебрюуоЬупиглЬетО десргосоелбО, десзевЬупагпеО, детзевЬураттО, де(девепЦ), десне(ЬупагпеО, де(лей)упип)ЬетО дебпебепбО. 718 Приложение Б.
Сокеты Б.4. Элементы пакетов 719 Ниже приводится пример обращения к функции детйоз(Ьупал)еО: ф1(бе( В50 (/!пс)ибе <зум(урез.П> !! для типа сабг С //епб1/ фбеы пе БЕКУ ИАМЕ зовелозт.з(пес(врапу.сощ //бе(тпе РСКТ ИОН 1050 // праизвопьний номер порта /ыег!пе п аббг и атыг 1!в([01 // для хранения интернет-адресов хостов зггист заскаббг !п щупозт аббг: /! Интернет-адрес локального хоста зтгист позып( <пр; // для хранения инфарнации об удаленнон хосте Мс гак з; !! дескриптор удаленного сонета // часть програиии.
специфическая для ЬИ1Х Ьтего((спаг *)Бщуиозт аббг. з1зео((шулозт ай)г)): // часть програими. специфичесная дпя И1пбсщз шевкет(йщупозс атЫг. О, зтгеат!щупал( аббг)): // заполнить структуру адресной инфориацией об удапеннаи сервере l/ и установить соединение с сервером щупозт аббг.з1п тащ11у - АЕ 1КЕТ: // используеное сеиейство адресов щупозт аббг.з1п(югт = Птспз(РОК) ИОН): /! испальзуеиий нанер порта тт (Пр = депцоз(Ьупаще(НТ ИЛИЕ) — Н)[Е) // вивести сообщение об ошибке и прекратить работу // часть програнми. специфическая для СИ[Х Поору(Пр->П папе.
(сПаг *)йвулозт а(Ыг.з1п аббг, Пр- П 1епд(П); // часть програини, специфическая для Н1пймз щевсру(дщулозт а(Ыг.з1п атЫг, Пр->П атЫг. Пр->П 1епдСП): 1((соппесцгпщ з.(зтгис( засйаббг *)йяу)юы ай1г. з(зео((щупая( аббг))1-О) !/ внвести сообщение сб ошибке и прекратить работу Функция Ьтего() операционной системы [Лч)1Х обнуляет буфер укаэанной длины. Это одна из функций, работавшая с массивами н байтами.
Функция Ьсоруо копирует указанное количество байтов из одного буфера в другой. Функция ЬслтрО сравнивает указанное количество байтов в двух буферах. Функций операционной системы [Лч)1Х Ьгего() и Ьсору() нет в тч/[п([огиз, поэтому вместо них следует использовать функции п)еп)зетО и п)еп)сруО. Нрилтер программы с использованием сокетов для получения 1Р-здреса хоста для данного имени хоста приведен ниже: (Ыег!пе И!И !/ НТИ для И1пзосй и В50 для сакетав 050 !)1Пс1ибе <з(гпо.П> !/ нувно яля ргтпс(() !)тпс1ибе <збб1тЬ.П> // пушно дпя ехт(О Втгю1ибе <з(г1пд.П> // нувно дпя шепсру() и зтгсру() //1ббет И1И (/)пс1ибе <н1пбое.П> // нуею для И!плоск //епбт( Й(бег В50 фтпс1ибе <зуз!(урез.П> // пушно для идентификаторов.
определяених систеной //!Пс1ибе <пе(1пе(/1П.П> // нушно для структурн интернет-адресов (/!Пс1ибе <апра/1пет.п> !! пушно дпя !пег п(аа() //1пстит)е <зуз/зссхеь.п> // нувна для зосхет(). ьтпб() и т, д. //1пс)ибе <Гспг1.П> //1пс)ибе <тетбЬ П> //Епбт ( тото ша1п(1п( агдс. спаг +агру[1) ( ))1(бе/ И1И ИОИО щуегзтопкециезгеб - идкптбк0(1,1); /! для функций НБА ИБАОАТА нзаОата: // для функций Ьбя фапбт( зсгист позгепв "тюзт; // структура для дегпозгьупаве() зтгист 1п а!Ыг аббгезз: !! структура для Интернет-адресов сПаг Паз( паше[256): // строка для ииени х(юга 1( (агдс 1- 2) ( рппг((" сшиБКА - неверное нсличество аргументов в коиандной страке1п"): рг1пт((" фарнат коианднай строки: 'детаббг Паз( паве'Тп"); ех1(( 1); ))1Гбе( И1И // Инициализация иблзосй ИБд5таг(ир(иуегзтопйециезтеб.
йтзаОа(а): Вепбтт // Копировать иия хоста в Паз( паве зсгсруйюзт паве, агдт[Ц). рг1псц" Войск 1Р-адреса для люта 'тз'.. дп". пояс пвще): поз( дегпозть)пщяеспазт пете): !/ Печать результата поиска 1т Сиад( — Н)Е ) рг1пт((" Не удается найти 1Р-адрес хоста 'тз' )п'. Поят паве): е1зе щевсру(йаббгезз. Поз(->п атЫг. 4): рг1пгг( 1Р-адрес хоста ттз': тз )п", поз( пщяе, !пес пгоа(аббгезз)); ) фттбеу И1И /! Очистить итпзасд Ь5АС1еапир(): (/епб(Г Прослушивание входящих запросов на соединение от клиентов Функция [тзбеп() используется на сервере в модели обмена данными на основе соединений, для того чтобы подготовить секет к приему сообщений от клиентов. Определение функции йз[еп() выглядит следующим образом: 1л( 11з(еп(1пт зб. !пт О)еп): 720 Приложение Б.
Соквты + зя? — дескриптор сокета после вызова функции Ь)пб(); + /??еп — максимальное число входящих запросов на установку соединения, которые могут ждать в очереди на обработку, пока сервер занят. Функция 1)збеп() возвращает целое число, равное О, в случае успеха и — 1 в случае ошибки. Например: 1/ ()1згеп(зб. 5) 0) ( // вывести сообщение об сшибке и прекратить работу Согласие на установку соединения с клиентом Ф нкция эссерах) используется на сервере в модели обмена данными на основе унк соединений (после обращения к функции 1)абеле), для того чтобы удовлетворить запрос на установку соединения, поступивший от кпиента: (/бе/1пе И)И // ЩИ Лпл Едпзоси и ВВВ лля сокетов ВВВ У1/бе/ ИИ У)пс)цбе <и!пбонз.п> // лля всех функций и1пзося фепб11 //1/бе/ ВЯ) я1пс)цбе <зуз/(урез.ь> (/1пс)цбе <зуз/зсскев.и> // Лпя стРУктули зосйаббг //епб11 МС ассерт(1пг зегчег з, зтгцсв зосйаббг * спел( аббг, 1пс * с)псаб(/г )еп) + ююет з — дескриптор сокета, прослушиваемый сервером; + сйепс гк/л(г — адрес клиента; + с!ппиЫг !еп — длина адресной структуры клиента.
В случае успеха функция ассерс() возвращает целое число, представляющее новый сокет, и — 1 в случае ошибки. П бращения к функции эссерах) удовлетворяется первый стоящий в очеосле о , что и в1 С реди входящий запрос и создается новый сонет с теми же свойствами, что и этого момента для общения с данныля клиентом сервер будет использовать этот сокет.
В результате многократных обращений к функции соппесЬО мы получим ляного новых сокетов. Пример использования функции эссерах): звгцсв зосиаббг 1п с) 1епг аббг; шг зегчег з, с)1епс з, супьаббг )еп; 11 ((с) 1епс з - ассерг(зегчег з, (зсгцст зосйаббг *)ас)1епг аббг ас) пваббг )еп) < б) // вивести сообщение об сшибке и прекратить работу // на вгои этапе погон или процесс пожег получить // управление и взять на себя общение с клиенток При последующих обращениях функция эссерах) вернет другие соединенные сокеты.
Этн соединенные сокеты мультиплексируются на том же порту сервера функциями работающего стека протокола ТСР. Б.4. Элементы сокетоа 721 Передача и прием сообщений через сокет В данном разделе мы представим только четыре функции. В действительности существует больше способов отправки н приема данных через сокеты. Для сокетов ТСР/1Р, как правило, используются функции зепб() и гесч(): 1ПЬ ЗЕПЩ1ПС ЗССЛЕГ. СОПЗГ ЧО1б ЯШЗд. иш1ЦПЕб (ПЬ Лщд )Елд(Ь.
)П( Г)адя). 1ПЬ ГЕСЧ(1ПЬ ЗССЯЕС, Чпяб *ГСЧ Ьил/, ЦПЗГЦПЕб МГ Ьи/Г /ЕПдг/ч ЯПС Падя) . + зосйег — локальный сокет, используемый для функций зепб() н гесч(); + /пзя — указатель на сообщение; + п)зя ?епвтЬ вЂ” длина сообщения; + вы/ Ьп// — указатель на буфер приема; + Ьи// ?епфй — длина буфера. + /?паз — флаги, изменяющие повеление функции по умолчанию. Например, чтобы указать, что сообщение должно быть отправлено без данных локальных таблиц маршрутизации (по умолчанию онн используются), может быть задано определенное значение флагов. Для сокетов 131)Р, как правило, используются следующие функции; 1пг зев)го(1пг зосяеь, попас чо1б ьшзд.
цгз1цпвб )пс лед )епдсь. 1ы ладя, ззгцсг зосйаббг >без( аббг. цпз1цпеб 1пг аббг )епдсл); 1пс гесч/гош(1пт зосаег, чозб *гсч ьи/б цпзгцпв) 1гь ьцп /епд(ь. н с г)адз. зсгцсс зоскаббг *згс аббг. цгзгцпеб 1пг аьб~ )епдгщ; Болыпинство параляетров этих функций совпадает с параметрами функций зепб() и гесч(), кроме параметров г?явг а/Ыг/ыс асЫг и ая?г?г ?еп/(гй. В отличие от потоковых сокетов, при отправлении и получении дейтаграмм с помощью перечисленных функций необходимо указывать адрес удаленного компьютера.
Б следующих разделах будет предоставлен пример программ для ТСР/1 Р н 1)Е)Р клиента н сервера, где будут приведены примеры вызовов всех четырех функций. Закрытие сокета Прототип функции закрытия сокета выглядит следукпцим образом: 1пс с)озезосяет()пс зб): // прототип Ебпбонз Ш( с)озе(1пс гб): // прототип ВВВ ИИ(Х Параметры/я? и зг? прелставляют собой дескриптор файла (аналог дескриптора сокета в (ЛчПХ) и дескриптор сокета. Когда сокет надежного протокола (например, ТСР/1Р) закрывается, ядро продолжает попытки передачи данных, н соединение переходит в состояние Т1 М 1 (Я/й11 (см.