В. Столлингс - Современные компьютерные сети (2-е издание, 2003) (1114681), страница 167
Текст из файла (страница 167)
Кьосв5ет. ИВЕ[. ИН[[, Дье1 (1шеоц() — О) // вывести сообщение для пользоввтеля е1ье С11епв ь - вссерт<ь. ИН[[. ИНЕЕ): Таким образом, процесс должен периодически опрашивать операционную систему с помощью функции ье(есг(), пота< сокет не будет готов к операции ввода-вывода. В отличие ат случая блокирующего запроса, при длительной неготовности сокета процесс, выполняющий функцию ье(ест(), сможет возобновить работу, когда истечет период ожидания функции ье(ее!(), но такое решение неэффективна. Опрос в цикле функций ье(ест) или эссер!О приводит к напрасному расходованию ресурсов центрального процессора. Б.Б. управление программой во время выполнения 731 Асинхронный ввод-вывод Лучшим решением является использование асинхронного ввода-вывода (то есть, обнаружив активность ввода-вывода секста„операционная система немедленно информирует об этом процесс и таким образов! избавляет его от необходимости настоянного опроса).
В оригинальной операционной системе ВЯ) Шч(1Х для этого используются функции ь!даю[(алО и ЕспЩ). Альтернатива опросу состояния сокета с помощью функции ье(ее[О заключается в там, чтобы позволить ядру операционной системы информировать приложение о событиях при помшци сигнала 51610. Для этого необходимо установить процедуру обработки этого сигнала с помощью функции ыдас[(апО. В следующем примере программы сокеты не использтуются. В нем просто показано, как установить процедуру обработки сигнала, Данная процедура перехватывает ввод символа прерывания работы программы клавишами СЕт(+С, устанавливая обработчик сигнала для 5161НТ (сигнал прерывания) с помощью функции ь!две[топ(): уота свтсп еггог(слаг >еггогнеььвце): // для обработки ошибок готб 1пте!тцрт51цпв1Нвп<йег(!пт ьюпа1Туре): // обрабОтка сигнала !Ьтегг тп! яш1п(1пт згдс, сЬвг дгдч[1) ( ьтгцст ь1дагттоп ьзпб1ег: // спецификация сбработчикв сигнала // использовать функцию !птеггцрт5тдпа1нвпгпег<) в качестве обработчике Ьвп<пеглв Ьвпгдег = !пгеггцр(51дпа1Напб1ег; // создать ивску дгя всех сигналов 11 <ь<дт!1)ьет<дьзпб)ег,ьв шаьи) < О) сатсЬ еггог("рвбота функции ь1дП 11ьет<) завершилась неуспешно ): // установить обрвботку сигналов прерывания 1/ (в!даст!оп(5!6!ит, дьвпспег.
0) < О) свгсЬ еггог("роботе функции ьшвс<1оп() завершилась неуспешно "); гог(::) ранье(); ы приостановить лрогрвнну до тех пор, пока не будет получен сигнал ехтт(0), чо<б !пьеггцртьтдпа1Нзпб)ег(!пт ьщпв1Туре) ( рюптт("прерывзние получено. прогрвннв остановгенадп"): ех1т(!). Флаг ГА5ТМС должен быть установлен равным дескриптору сакета с помощью функции Еспб(О. Сначала мы уведомляев! операционную систему о нашем желании установить новую процедуру обработки для сигнала 51610 с помощью функпт!'1 732 Приложение Б. Сокеты Б.7.
удаленное выполнение консольного \у!паоьнш-приложения 733 в!оас(!опО, Зателт мы заставляем операционную систему предоставлять сипталы текущему процессу с полтощыо функции Гспс((). Этот вызов гарантирует, что среди всех процессов, имеющих доступ к сокету, сигнал передается именно текущему процессу (или группе процессов). Затем мы снова используем функцикт Гспт((), чтобы задать флаг состояния равным тому же дескриптору сокета для асинхронного флага ГА5УИС. Следующий фрагмент программы с использованием дейтаграммных сокетов следует данной схеме (для ясности все детали пропущены): тпт шатп() // создат~ сокет для передачи/присна дейтаграни // инициализировать адресную структуру сервера // связать с локальнын адресом // установить обработчик сигнала 51610 // создать маску дпя всех сигналов тг (з(ртт)1зет(Впало)ег.за шаьк) < О) // вывести сообщение об ошибке и завершить работу // сброс флагов Папб1ег.за Паря - О: тт (зтбастлоп(51610.
Дбапб)ег, 0) < О) П вывести аюбщение об ошибке и завершить работу // нан пушно владеть соиетон. чтобы получить сообщение 5!6!О (т (гспг)(в яосхем Г 5ЕТОыд, Оетртб()) < 0) // вывести сообщение об сшибке и завершить работу // организовать асинхронный ввод-внвод и доставку сигнала 51610 ! Г ( !сот)( в восвет . Г 5ЕТГ! .
ГА5тщС ( 0 щОПВСОСК) < О) // вывести сообщение об ошибке и завершить работу Гог (;;) ранье П. В операционной системе %'шс(отнв функция ве(ес(О не реализована. Для запроса уведомлений о сетевых событиях используется функция В5ЯАвупс5е1ес!О. Эта функция требует, чтобы диналтическая библиотека Вв 32./)11 посылала сообщение окну, идентифицируемому дескриптором окна ЬВП((: щ5ААзупс5е1есы50скет зос/тес. н!ПО лмтт(, нпвщпео тпс мчвр.
)опч 1енелп Тип 5ОСКЕТ определен в файле ьн(п вас(т.Ь. Дополнительную инфорлтацию по типам данных операционной системы %"шс(оьнз можно найти по адресу Ьгсрт// п(вт)п.)п!сговоГ(.солт/!!Ьгагу/рвб)т/рв()(тгеГ/(уре Ва((В.Ьь)п. Параметр зосйег представляет собой дескриптор со кета, Ь )(/ппт — дескриптор окна, иМяК вЂ” сообщение, а /Еаепг, как правило, представляет собой |(одвт всех событий, а которых операционная светел(а должна уведомлять окно, объединенные оператором логическога ИЛИ. Вот примсрынекотарыхкодовсобытий:ГО СОИИЕСТ(соединенисустановлена, ГО АССЕРТ (готовность к установке соединсния), ГО КЕАО (готовность к чтешпа).
ГО Вк1ТЕ (готовность к записи), ГО СС05Е (соединение закрыто). Вы мажете включить следующий фрагмент программы с использованием потоковых сокетав в покааанпую выше программу или в свое собственное приложение (детали снова спущены): // сообщение для асинхронного уведоиления й)еттпе ьивй (ЩН 05ЕВ « 4) // сокет восвет з уше создан и привязан к инени // прослушивать запросы на установку соединения ! Г ()тзтеп(зосксс з 3) == 50скет еддбд) // вывестн сообщение об пвибке // и завершить работу после чистки // получить уведомление о входящеи запросе на установку соединения тт (щ5Авзупс5е)ест(з. Пнщб, инвч. ГО АССЕРТ) — Я)СКЕТ ЕЙВОД) О вывести сообщение об ошибке // и завершит~ работу после очистки е1зе Ы принять входящее соединение Дополнительные сведения по вопросам асинхронного ввода-вывода можно получить в книге Е)опа!тоо ап(1 Са!нег( <Т1те Росйес Сп(г)е (о ТСР/1Р ЗосЬегз— С н/егз)оп» (для Т)Ь)1)() н по адресу Ьттр://и(щлш.)п((р.солт/восйей а также в книге Вой С/п)пп «*нт/шс(оы/з Васйеыз Ь!е(тнагй Ргодгаштп)п)(» (для ТА/шс(отнз) и по адресу Ь(!рт// ы/ылл,вос(те!в.соп)/.
Б.7. Удаленное выполнение консольного МИпбо~йГв-приложения Простые операции с сакетами могут использоваться при решении задач, которые трудно решить другилти способами. Например, с помощью сакетав возможно удаленное выполнение приложения. Ниже приводится пример такой программы'. С помощью двух программ, использующих сокеты, локальной и удаленной, консольное Ъ'!пс(отнз-приложение (файл с расширением .ехе) переносится с локального хоста на удаленный хост. Затем зта программа выполняется па удален!гав! хосте, после чего ее выходные данные (вЫоат) возвращаются на локальный хост. ' В написании двух сдвдутощпх программ принимали участие Кон Кристапс<и (Коп С!тпвтгвпьол) и Карл С. Лятмгг сс (Квг1 5.
Ехтяхвв) с кафедры кибер инин кп упине!кш етв Юхтког! Флориды (Пир // тнннтн.сяле.няЬх)н/-с!тпвтеп/(гю!я). 7З4 Приложение Б. Сокеты Б.у, Удаленное выполнение консольного т)Я<Обои/в-приложении 7ЗБ Локальная программа <5<б1о.п> <зтб)ТЬ.Ь> <5<г!п9.Ь> Ъплбоыв.ль <ТОП<).пь <зув\51ат. Ь> <!о.бь для рг!П11() дпя ехтт<) ДПЯ ЯЕВСРУ() И всгсру<) для 5)еер() и Кдпзаех для констант файлового ввода-вывода для констант файлового ввода-вывода для орел(). с1азе() и еоП ) <Ыелпе РОЯТ МОМ 1050 П произвольный непер порта для сервера №бейпе МАХ [15ТЕМ 1 // иаксииальная длина очереди №беттпе 512Е 266 // разиер буфера переноса в байтах чотб ва!П(тп< агдс, спаг *агдчП) ибйО инегвтопйеяцевтеб = мдкеидй0( 1. 1): // функции и5А ЬБ/ОПТА изаОа1а; П структура данных Елпзаей АР1 цп5!Япеб <п< 5[гост зосдаббг тп втгцст зосйаббг тп цпв!Япеб слдГ цпзтдпеб тпт от~5!Япн1 тпд зсгцс< Ьовтепт 51гцс[ !и аббг спаг !п1 цпзтдпеб тпт 51ГОС< заойаббг 1п 51гцс1 тп аббг ГЕТОТЕ 5; гевоте аббг! зегчег ай1г; Ебп быт[51/Е1, (Ь: 1епя<Ь; *ЬО51; асЫге55: ПО51 паве[2561; абб! <еп: 1оса1 5: 1оса) аббг; гевате тр аббг; П проверка синтаксиса коиандной строки тг (аг9 !-4) ( рг!птП" '"'" ОШИБКА - долина бить '1оса1 (Ьозг) (ехе/11е) (аост!1е)'<п"): Рг!Пт/Г' где аозт - иия хоста *или*!Р-адрес 1п ): рг!Огт<" хоста.
на которои работает геяюге.с. 1п")-, рг!Птт(" ехе<М 1е — икя файла для удаленного загуска, а 1п"); рг!п1((" оц1П 1е - икя локального файла вывода <п"): ех!1<1)! // инициализировать итп5асй МБА51аг<цр(иуегв!Опйеяцезтеб. Бчвадата): // скопировать иия хоста в Ьозг паве зтгсру<бозс паве. агдчП)): // найти хост по иненн Ьазт = дегпозгаупаве(агдчШ ): т№ <Ьозт == МОЕ[) ( РГ!П1((" ь"* ОШИБКА — 1Р-аДРЕС ДЛЯ 'Жв' НЕ Найлви <П, ЬО51 ПаПЕ" >; ехтгП); №1пс1цбе №тпс1цбе №!Пс1цбе №!ПС1цбе №!Пс)цбе №!ПС1ыбе №1пс1цбе П нуина // нувно // нувно // нувно // нуино // нувна // нувно // дескриптор удаленного сонета // удаленный Интернет-адрес // Интернет-адрес сервера П буфер длв переноса фаЙла // описатель файла // разиер перенесенных данных // структура для детпоз<аупвяе() l! структура дпя Интернет-адресов // строка для иненн хоста // длина Интернет-адреса П дескриптор локального сокета // локальный Интернет-адрес // удаленный 1Р-адрес и скопировать 4-байтовый 1Р-адрес клиента в структуру аббге55 ввясру<ааббге55.
Пазт П аббг, 4). /! создать сокет для удаленного хоста гвязте 5 - заойет(АЕ 1МЕТ, БОСХ Бтйедн, О); // заполнить адресную инфорнацию удаленного (серверного) саке!а П и соединиться с сыидающни серверои зегчег ай1г.сбп тавт1у - АР 1МН; // используеиое сенейство адресов 5еГчеГ абб1 .5тп рог< - Птопз<РОКТ МОМ): П испопьзуеный нонер порта зегчег аббг.51п ай1г.з аббг = 1пес п[оа<аббге55)): П 1Р-адрес саппесс<гекю<е 5, <вгпкс засйай1Г ")$5егчег аббг, зтгеот<вегчег атЫг)); !/ открыть и прочитать *.ехе файл т П (<Ь - орел(агдч[21, О ЯСОМ[У ( О 01ддйч. 5 1йЕАО ) 5 1ьй!ТЕ)) == -1) рг!Гт.т(- ОшиБИА — не удается открыть файл 'Жз' тп".