Искусство программирования на Си (984073), страница 69
Текст из файла (страница 69)
АбСтраКтНЫЕ СЛОИ Это очень бширная тема, так что во всей полноте ,йгзстд?Л)Гоннкьфй,снрйн,—,,.зтй дууддкыияникнаык,гцупйа,фи)гшйыйь„,,озгаьлраор; еьби„а а...,,юмикгд ыпхь о Ю...,' ",„' Сь,. -",, " ',;"», '..„'",:;~',"';'",,:. "„„,'%,,";Г;„'?ь „, '. „',-:;,:"„,'!,...е . '„СГ)кьчьч"'":Ч ьсц', -'н "" ' "е 'Наг"." е б . Ке' ТСР/(Р— это двунаправленный протокол управления потоком на основе соединений.
Этот протокол гарантирует последовательное ос> шествление надежного (без ошибок) управления потоком данных. Каждый пакет распознается с использованием последовательности чисел внутри заголовка пакета. Проверка ошибок проводится с помощью алгоритма СВС (С|с!)с Кедцпдапсу Соде — контроль, осуществляемый с помощью циклического избыточного кода) в пакете. Это гарантир>ет, что пакет будет доставлен по назначению неповрежденным. Протокол И>Р— полная противоположность ТСР.
Для полдержания механизма передачи он требует больших усилий. Это просто означает, что пакеты могут прибывать беспорядочно, с ошибками и, в конце концов, могут вообще не прибыть. И хотя надежность ТСР не дается бесплатно, издержки $Л)Р довольно значительны. Применение сокетов ТСР, как правило, называется трехступенчатым установлением связей (3-ьчау нчадкьаЬ > .Я,атом,пдпцессгьнениший момпьюстепс д аэ тс не лучший способ пересылки сообщения. Она может быть поставлена в целости и сохранности. Может прибыть разорванной. Может прибыть на шесть месяцев позже срока отправки или, наконец, может потеряться в почтовой системе и никогда не прибыть.
Чтобы определить, какой метод является более подхоляшим для вашей программы, необходимо рассмотреть природу используемых ланных. Действительно ли каждый одиночный байт, а на самом деле каждый бит критичен? Можете ли вы позволить себе потерять какие-либо данные? Когда вы работаете с финансовыми или навигационными системами, то ответ на второй вопрос однозначен: "Нет". Но бывают случаи, когда ответом может быть "Да". Как насчет прямого воспроизведения вилео? В первую очередь при передаче вилео обращают внильание на скорость. Самое главное — быстро, насколько зто возможно, передать данные реального видео, чтобы обес- Я3— Доаоенитееы<ые теча то чесеиерач елы Л»ежк<ат4ормеоная разработки чрогро чмирооачие коим> ниеациоииы» средсто дяВД<»В Часть В1 Глава 22 ЙИИ даж за предыдущий лень по всем подчиненным магази- диться, что данные будут доставлены по назначению.
яе есг, функция Спесквогпага() определяет, имеются нам. (Сейчас не будем учитывать вопросы безопаснос- Самый простой способ — назначить кажлому пакету ли данные, ожилающие извлечения, но на самом деле ти этих операций.) данных определенный номер, который идентифициру- еся пять работают с библиотекой сокетов. Библиотека она не извлекает эти данные. Сначала мы получим решение для ())Ч!Х, а затем ет программу, для которой предназначен пакет.
Этот разработаем решение лля У»<)босая. Эти решения очень номер называется камер<>м лар>ла. и ги ких дисков похожи, но не идентичны. Затем будет показано, как Требуется выбрать номер порта, который, скорее яуя>(урез.й — лля макроса Мова(), вуя/яос)»е1.Ь поддер- В действительности Функция яе!ес)Ц просто отслеживает можно упростить процесс подключения, написав абст- всего, не будет конфликтовать с программами, запуска- живает п тотипы лля ф н й с к т ' ()) дескрипторы файлов. В среде с>м>х значение О дескрилрактный слой для непереносимых частей программы. емыми на нашем компьютере. Номера портов хранятся в )6-битовом целом числе без знака, поэтому имеется Сокеты, испольэук)щие ТСР под зовов сокетов.
его я буквенный зквивалеит функции ЬЬЬИП. управлением 0М!Х числа в диапазоне от 0 до )023 предназначены для ре- чп1яС>1п яСО пСсоп1с С боле> зерна, однако их нельзя использовать для этой конкрет- 'б ' СЬ б1 (' С В' ) зпс ЯосХЫчлг чоИ зпСЬапб1пг(зпС ВСО) Требуется написать две пРогРаммы: сервер (программу, ной программы (в действительности на многих компь- зпс печ Ыые> ( котоРУю мы хотим запУстить на компьютеРе головного ютерах ис о ьзующих ())ч))Х вообще невозможно юте ах, использующих , воо ще невозможно боле = 1; офиса) и клиент (по олной копии которой будут уста- использовать эти номера, даже для прелназначенной лля ! новлены на ка:ялом полчиненном кол»пьютере).
Начнем них цели, если не зарегистрироваться в корневол» катаяпсх1еп С взп я)япые> с се ве а зпс СЬвсхупгваса( 1пС япсх)б! сЬаг баСа(255)ы(О); с сервера. логе системы). Когда выбирается номер порта или со( сЬаг *епбр> Программа ()нп(-сервера кета лля использования, следует проверить существую- яСгпсС С)ввча1 Сч; щую базу стандартов (оформленную в серию Ы явС гяаб Ы; Г)ЬВ *Ср> Меисеаали)нерменнанра роя те а лрасраммироеание натмунинааианнын среясо е яьоелояа(аев Ро, 2) ПП Доласнитаснные тематнчесниеран)асы $ с Часть )И Глава 22 гу(гр .= ВВЬЬ) Далее открывается сокет с помощью функции Если ассер(О все-такн вызывается, то это означает, яосйе(().
Эта функция возвращает дескриптор файла для что есть ожидающий обработки пакет. Поскольку кажвыполнения последующих обращений к библиотечным дое прина.гос и прочитанное соединение закрывается, ) ( саггеагеоеа1 = яегеоа1(даеа, аеас)р, 10)1 Функшим сокетов. то лолжно появиться новос соединение. Кроме того, мы Весь описанный процесс продолжается столько врс- ВОСК БТ)(ЕАМ указывает, что предпочтительно не позволяем старылс соелинениям существовать аоста- монн, сколько необходилю.
Нажав С(г)+С, пользователь этот сокет должен использовать механизм передачи точно долго, чтобы иметь возлюжность получить второй подает сигнал программе, что нужно остановиться. Рс1ояе(гр)1 ТСР, а не ()ПР. пакет. Так что функция ассер(О даст нале новь|й дсск- В этом месте обработчик сигналов устанавливает перс) риптор сокста для использования с этим новым сосди- лсенную контроля цикла лля того, чтобы цикл завершил е1яе ву авсгг.е1е Рта11у = ВР 1ХВРс ( ву алас.яьв аде)г.я аддг пением. Затем этот дескриптор сокета лсожно исполь- следукнций тест.
В данный момент можно закрыть прорг1ае(( Сооьс(а'Г геас) Ше Вя1а ву аддг.яьа роге = Веоая()ВЭ))1 зовать для передачи функции гестО„а буфер — для слушнвающий секет и записать данные в выходной Ргьеваве)1 вевяег(ву а извлечения Фактически поступивших данных. файл. ) ву ас)ог.я)а хего); После обрапщния к функции гест() мы получаем Чтобы пользователь мог легко остановить програлс- з( ((яоскгд = яосхег(лу гввт, воск втввли, му сервера, с помощью функции я(вва)() установим ° в)) == 1) кот проверить, где расположены данные и каков объем»ва11.)а*); обработчик прерываний. Строго говоря, единственное, ( принимаслсыл данных.
Последний параметр, для опре- Рр = (орел(Р11еааве, "е"); что позволяет стандарт т А)с(Я С делать в обработчике рггаг(( ваехресгес) еггог оа сделать в о ра отчике деленных Флагов в этом случае не нужен. Значение 0 гр((р ~= ВОЬЬ) < сиги лов (с учетом переносихсости), — изменить значс- позволит функции гестО использовать значения. при(рг1вь((гр, $1а)а , аемеоеа1); ние псрслсснной я(я а(оппс (. Так и сделаем. Модифи- нятые по умолчанию, которые лля наглого примера (с1ояе((р)р Ф Допптип есиные тематинесниеризде си Часть Ьч Листинг 22.2. Исходный код для []$[!Х-клиента ТСР $1пс1пае <яв01о.Ь> $1пс1пде <я1011Ь.Ь> А/етп атформеннон разрабтпка.
прснрпимирстанссе комн)пик аиионнык средств ят (гпсч(яоскгд, дава, яхяеог ааса, О) 1) СОКЕТЫ, ИСПОЛЬЗУЮЩИЕ ТСР ПОД управлением ][)[[прои/Б $1пс1пс[а <еггпо.Ь> гехпгп ВХ1Т ТА1ЬОВВ; Программы сокстов %]пс]охчя используют библиотеку $1пс1псе <Яхгзпс.в> ) АУ[лаос)с, которая очснь похожа, но, увы, нс илснтична $1п<1пае <ппСОЬ.Ь> $1пс1пде <пехгпав/1п.Ь> рггп ггпь(/ аесехчеса ая]п", баха); сокстам Беркли. К сожалению, в книга нст наста для $[яс1пде <яуя/яосвеС.Ь> описания вссл различий.