В. Столлингс - Современные компьютерные сети (2-е издание, 2003) (1114681), страница 163
Текст из файла (страница 163)
приложение на другом конце соединения, называемое серверам (зегтег), представляет собой программу, пассивно ожидающую входящих запросов на установку соединений от удаленных клиентов. Как правило, серверное приложение загружается при запуске системы и активно прослушивает свой хорошо известный порт, ожидая входящих соединений. Клиентские приложения пытаются установить соединение с сервером, после чего начинается обмен даннылги по протоколу ТСР.
По завершении сеанса связи клиент, как правило, разрывает соединение. На рис. Б.2 представлена базовая модель взаимодействия, основанная на концепции потоков (или сокетов ТСР/1Р). Запуск программы с сокетами на изолированной машине под 1))т!пс)о1Атв Если набор протоколов ТСР/1Р установлен на одной машине, вы можете запустить на ней обе программы, и клиент, и сервер (если набор протоколов ТСР/1Р не установлен, то при попытке обращения к совету можно ожидать возникновения исключений В(пбЕхсербоп, Соппес(Ехсербоп, Рго(осе(Ехсербоп, 5осКеТЕхсерг(оп и т.
д.), Следует использовать локальный хост в качестве имени хоста или адрес 127.0.0,1 в качестве 1Р-адреса. Запуск программы с сокетами на одной сетевой машине под И1пооачв Когда клиент и сервер запущены на одной машине, даже соединенной с сетью, вы будете общаться сами с собой. Важно знать, соединена ли ваша машина с сетью ЕсЬегпес или взаимодействует с сетью через телефонный модем. В первом случае 1Р-адрес будет назначен машине без каких-либо усилий с вашей стороны. В случае общения с сетью через модем вам придется дозвониться, получить 1Р-адрес, после чего вы сможете <поговорить сами с собойм В обоих случаях вы сможете узнать 1Р-адрес машины, которой вы пользуетесь, с помощью команды уг(п(рс(О в операционных системах Ъ%пОХ или команды 1рсопбп в операционных системах %'(пХТ/2К и $ЛМ1Х.
Б.4. Элементы сокетов Создание сокета Ф1пс!вбе <эуэ/Гуреэ.)л г)1пс1гх)е <эуэ/эосхет.л> 1лт «кхетыпт богеул. 1пг Гуре, 1пт ргегссо)1 + Константа г(ота(л (домен) может принимать значения АЕ ОИ1Х, АР 1ИЕТ, АЕ 051 и т.д. Значение АР 1ИЕТ позволяет взаимодейсгвовать через объединеннУю сеть по 1Р-адресам.
Мы будем использовать только это значение. + Константа йг)эе (тнп) может принимать одно из следующих значений: 50СК 5ТкЕАИ (транспортный протокол ТСР, ориентированная на соединение надежная связь), 50СК ООЯАИ (транспортный протокол (Л)Р, дейтаграммы. ненадежная связь) или 50СК кА)1) (1Р-уровень). + Константа ргогосо1 (протокол) определяет протокол. Как правило, значением этого параметра является О. Это означает, что задействуется протокол по умолчанию для выбранных значений домена и типа. В наших примерах всегда будет использоваться значение О.
714 Приложение Б. Сокеты Б.4, Элементы сокетов 71Б В случае успеха процедура ьос(теь() возврап(ает дескриптор сокета, представляющий собой целое число, в случае неудачи возвращается — 1. Ниже приводится пример вызова: 1Г ((ьб - ьосйет(АР 1ИЕ(. 50СК ВОЙДИ, О) < О) ( ргтпс/("обращение н ьосйес() завериилась неудачей."); ех!С(1): ) Адрес сокета Для хранения адреса в домене /(Г 1В?ЕТ используется следующая структура; ьтгист 1п всбг ( цпьтдйеб )опд ь вббг; ): Структура !и а((()г просто предоставляет имя типа (ь а()()т) языка С, которое может быть ассоциировано с 1Р-адресом: ьбгцсс ьоскаббг тп ! цПЬ1дпед ьаогт ь1п таит?у; // идентификаторы ЛР 1ИЕ( цпь!Опеб ьпогт гпп рогтц // номер порта.
// если О, тогда выбрано ядро ьтгцсь тп вот!г юп дббг: // 1Р-адрес // 1иАООВ лит ссылается нв 1Р-адреса тенущего хоста слег ь1п дега(81: // не используется, всегда ноль ): В структуре ьос((а()(!г тп объявляются локальный и удаленный адреса. В зависимости от этого объявления структура ь! и а(Ыт будет представлять локальный или удаленный 1Р-адрес. (В операционных системах семейства (Лч?1Х для использования обеих структур вам потребуется включить файл <пе1!пеб/!п.)т .) Привязка к локальному порту фбег1пе и1и // и1и для и1пьоск и В50 для сонетов 050 (/1ббет И1И фтпс?цбе и!пбояь.пь // для всех функций И!песах вепб! г (/(Гбет В50 (/т пс) цбе <ьуь/!урез.
Ь у1пс? цбе ьуь/ьоскет.и // для струнтуры ьосдвббг 1пт бтпб(тп( ?оса? ь, салье ьтгцст ьосйаЫг *з/тт/г. 1пь ва(/г?еп): + Параметр 1оса1 ь задает дескриптор локального сокета, создаваемый функцией ьос((ет(). + Параметр атЫг представляет собой указатель на структуру, в которой хранится адрес (локальный) этого сокета. + Параметр п/Ыг/ен указывает длину структуры (в байтах), на которую указывает аоттг.
Функция ЫпдО возвращает О в случае успеха и — 1 в противном случае. После обращения к функции Ып() и с сокетом ассоциируется номер локального порта, но удаленный порт еще не задан. Ниже приводится прилтер вызова: ьтгыст ьосквббг тп па!е пвие. ь ! п твы1)у - ЛР 1ИЕт; // используется Интернет-донен паве.ьтп рант - Птапь(О); // порт предоставляется ядран паве.ь!и вббг.ь всЫг = Птоп)(1ИАООВ ЛИУ); // используется все 1Р-адресе мола 11 (ьтпб()асд) ьоскес.
(ьсгцсс ьсскаббг *)Впаве. ь1геоцпвяе)) 1- О) // вывести сообаение об сшибке и завериить работу Обращение к функции Ып((о необязательно на клиентской стороне и обязательно для сервера. После обращения к функции Ы п()О мы можем найти ее адресную структуру по дескриптору сокета с тюмощью функции Оебьос((паше(). Представление данных и порядок следования байтов В некоторых компьютерах используется обратный порядок следования байтов.
Это касается представления таких объектов, как целые числа в пределах машинного слова. В компьютерах с обратным порядком следования байтов самый старший байт целого числа хранится в самом левом байте слова, а самый младший байт целого числа — в правов! байте машинного слова. Таким образом, число 5 2'в+ 6 2'+ 4 будет храниться на разных машинах по-разному: + адресбайтавпамяти: О 1 2 3 + прямой порядок байтов: О 5 6 4 + обратный порядок байтов: 4 6 5 О Как можно видеть, если прочитать слово неверного размера на машине с прямым порядком следования байтов, мы получим неверный результат. В то же время, на машине с обратным порядком следования байтов иногда может быть получен верный результат.
Обратный порядок следования байтов, в некотором смысле, является более естественным для человека, так как мы привыкли читать числа слева направо- Компьютер Брасс корпорации 5пп представляет собой машину с обратным порядком следования байтов.
Когда она общается с компьютером 1-386 РС (который является машиной с прямым порядком следования байтов), имеет место следующее несоответствие: компьютер с процессором 1псе! интерпретирует число 5 ° 2 в+6 2'+4 как4 2" +6-2'+5. Воизбежаниетакойситуациинаборомпротоколов ТСР/1Р определен машинно-независимый стандарт порядка следования байтов в сети, В ТСР/1Р-пакете данные передаются старшим байтом вперед, что соответствует прямому порядку следования байтов. 715 Приложение Б. Сокеты Б.б. Элементы сокетов 717 (Ыет1пе зггист Позгепт ( спвг ЯП паве; сбег 'П в11дзез: // официальное иня хоста // завершающийся нулеи список // псевдонииов для зтото икта // тип адреса хоста. например. ду !ИЕТ // длине структуры адресов // зввершво)вйся нулен список адресов // с сетевын порядном байтов П аббгтуре: П 1епЯСП; '"Ф втЫг 11зг: тот тпт спаг ))бе/1пе И1И // И1И для Итпзоск и 050 для сокетав 050 я)тает ВВР //)пс1ибе <зуз/(урез П> $1пс1ибе <пестпет/1п.п> //тле!обе <зуз/якхеС.П> //япб1Г В ЪЧп3ос)( для различных значений используется сетевой порядок следования байтов.
Функции Ьбоп(О, ЬгопдО, пбоЬК), пбойзО гарантируют использование правильного порядка следования байтов в вызовах %'!л3осх АР1 независимо от того, прямой или обратный порядок следования байтов используется в компьютере. Для преобразования чисел иэ одной формы хранения в другую используются следующие функции: + цпз)дпеб (опд/т/ап/(цпд)дпеб й)лд п) — преобразование 32-разрялного целого без знака из формы его представления иа хосте в представление, принятое в сети; + цад(дпеб 1опд Ьатз(ипгбдпеб зйотб п) — преобразование 16-разрядного целого без знака из формы его представленьи на хосте в представление, принятое в сети; + ипз(дпеб 1опд пгай/(ипзтдпеб 1опд и) — преобразование 32-разрядного целого без знака нз формы его представления в сети в представление, прин)пое на хосте; + цпмдпеб Ь)пд плт/ьт(цпв(дпеб зйогь и) — преобразование 16-разрядного целого без знака нз формы его представления в сети в представление, принятое па хосте.
Установление соединения с сокетом Удаленный процесс идентифицируется 1Р-адресом и номером порта. При вызове функции сон песб() на локальном сайте делается попытка установить соединение с удаленным компьютером. Это необходимо в случае связи, ориентированной на соединение, например при использовании сокетов, основанных на концепции потоков (ТСР/1Р). Иногда функция соппесбО вызывается также при использовании дейтаграммных сокетов.
Делается это потому, что данная функция сохраняет локально адрес удаленного компьютера, поэтому нам не нужно впоследствии при отправке каждой дейтаграммы указывать адрес получателя. В результате вместо системных вызовов зепйоО и тесу(пип() мы можем воспользоваться системными вызовами зепбО и тесчО. Однако такие сокеты не подходят для получения дейтаграмм от других адресов.
Же!тле И1И // ЬДИ для И1пзосв и ВВР для сонетов ВЮ Гт1 Тает И1И Йпс1ибе <н1тя)онз.п> // необходиио дпя всех функций Итпзосд //епб11 // необходимо для идентификаторов. определяенных системой // необходино для структуры Интернет-адресов // требуется для заедет().
Ьтпб() и т. д. МС сочтесг(тпт )асд) з. сатзт зтгисв зссйвббг *гетоге дббг, 1пг пв(да)/г )еп) + 1аса1 д — дескриптор локального сокета'„ + гетоте атлзг — указатель на адрес ттротокола другого сокета; + птаат/т/г 1еп — длина адресной структуры в байтах. В случае успеха функция соппесЦ) возвращает целое число О, Об ошибке данная функция в операционной системе 1)(!)пс(оьчз сообщает ненулевым значением, а в операционной системе 111>11Х вЂ” отрицательным значением. Ниже приводится пример использования данной функции: 1)бе!тле РРКТ ИОИ 1000 !/ произвольный ноиер порта зггист зосйвббг тп зегч аббг: /! адрес Интернет-сервера 1пь пвв з; // дескриптор удаленного сокета // заполнить структуру адресной ин)арменией об удаленнои сервере /! и установить соединение с серверои вегчег вббг.з1п Твш11у - ДР !ИЕТ: // используеиое сеиейство адресов зегчег всЫглнп рост - Посля(РОИТ ИРИ): // используеиый нонер порта зегчег дсиг.з)п атЫг.з вббг - 1пег вббг(1пет пгоа(аббгезз)): // 1Р-адрес зб (ссппесг(пл( з.(зогк( зосйаббг *)фзегч аб)г з1зеоцзегч аббг)) 1= О) // вывести сообщение об ошибке и прекратить работу Функция де1Ьов1Ьупатео Функция десйозбЬупаптеО принимает в качестве аргумента имя хоста и возвращает й)() ЕЕ в случае ошибки или указатель на экземпляр структуры Ьозбепб в случае успеха.