Искусство программирования на Си (984073), страница 70
Текст из файла (страница 70)
Но, по крайнсй мере, мы мояьнвдочп(яосхгс[,2); жсм разработать сервер и клиент под управлением хпх дапс[ов[1пх и) гехпгп ВХ1Т ЯОССВВВ) 'чч]пс]охчя. Поэтому бсз дальнсйших предисловий давайгпьсгп (хпт)(п * (гапс[() / (1.0 е (йопЬХа]ВАНО ИАХ))); Нс так уж и плохо, нс правда лиу Но опять жс, этот ]АЛО()ОВ/в программа сервера [пх аазп(1пх агсс, сЬаг *агяч[]) код в определенной стспсни нспсрсносим.
Ни эта проКак видно из листинга 22<К %шс[озня обычно всс делазпя яосх10=0; грамма, ни програкзхса для ссрвсра никогда нс компилист по-свосму. Наличие функний зчЯАЯ(аг(вр() и сЬаг паса[255)=(0]1 руются в типичном компиляторе под управлснисм ХУБАс[сапврΠ— это, возможно, наиболсс очсвидныс яьгпсг Ьояьапт «Ьп; %[пбохия. Как жс это сделать в %]пс[охчя? яхгпсх яосхас[пг хп СЬе1г аде[с; отличия от кода [)[Ч!Х. Кроме того, %шс]охчя-всрсия использует различные заголовочные файлы н имеет огромягапс](С[па(НОЬЬ]]; нос количество различных типов — БОСКЕТ, АУОИ) и т.
д., — которые мы должны использовать для своего Мсмсл амднрменнанраеробонко. нроерам роаанискоммуникоционнылсредин Часта О( Гпава 22 ЯОСХВТ печ посв; япппдочп(воск 2); ООСКАООВ 1В пу аоог; геппгп ВХ1Т РА1ЬОВВ сЬаг баса[255) (О»1 ) сЬаг *епйр) г( ( 11япеп(яосЬ, ЯОВАХСОВВ) == ЗОСКВТ ВВВОВ) Р1ЬВ к( РО ( рг1п11("Опехресгеб еггог оп 11вГеп()(п ); сваг Р11епаае(РТЬВВАВВ ВАХ) = ОВРАОЬТ РТЬВ ВАВВ; ппв1дпей 1опд спггепсооеа1 = 0; ппя(дпей 1опд печГопа1 = 01 ЬТ(агдс с 2) ( чо11е(!Оопе) рг1пс(( Во Ше врес11(ей.
Оягпд 1 ав( (п", ( ОВРАОЬТ Р1ЬВ ВРОЯВ)3 11(0 1м СЬесЬРогпапа!яосЬ)) ) ( е1ве печ восЬ = ассерс(ясса, ВОЬЬ ВОЬЬ)' 1(печ васа == )ВЧАЬТО ООСКВТ) япгсру(Р11епапе, агдч[1)) ( ) рггпеу('Опехрессео еггог оп ассерс() 1п ); ) Тр = (ореп[Р11епапе, г ); аепвес(баса, О, в1хео( йапа); 11((Р ~м ВОЬЬ) ЬТ(гесч(пЕч воск, дага, я1яео( баса,о) 11(ВОЬЬ ) Тдепв(оаГа, я(хео( Оапа, (р)) ООСКВТ ВВВОВ) Дппа ииипезнные темато вские разде ы Мезкпзатформсннап разработка просрапмированискаизеникационнызсредств Часть К! Глава 22 Это могло бы быть намного хуже. Код 'зз)пс)оизя до- только с кодом сокста, но и со всей СзШ-концепцией СЬезг аддг.ягп аддг '((ЬР1К АООК)'Ье->Ь аддг 11яс); статочззо похож на код СЛк((Х, поэтому абстрактный йишс)озпя.
Это сделать не так просто. СЬе1г аддг.ягп роге = Ьсопя(1091); слой просматривается относительно легко. Но так бывает не всегда. Например, если мы написали прог ам- уу(пс)оетв-программа клиента и ора пвеС = соппесс(яосксд, (ЬРВОСЕАООК)АСЬегг аддгс му %шс)егия полностью в СС)( вместо консольного при- Теперь, когда мы увидели родную программу ТСР-сср- Няеос[ясгисс яосКаддг)); ложения, то слою выделения придется управляться нс вера, работаюшсго под управлением%юг)опия, влистин- з[ (плеС == ЕОСКЕТ ВККОК) гс 22.4 приведем программу клиента. ргзпСС( Еггог оп соппесс().1п'); Листинг 22.4. Исходный код для ТСР-клиента под управлением МЛп()оиия гесигп ЕХ1Т РА1ЬОКЕ; $1пс1иде <яед[о.а> $1пс1иде <всг1пд.Ь> ярк[пег(даса, $1и Вгапсь Ед", $1пс1иде <СЕве.Ь> (ипя1дпед 1опд)вапдов(10000), Капс1иде «КСпяосК.Ь> Каппов(100)); зпС Капдов(1пс и) пвеС = яепд(ясах[0, даса, ясг1еп(даса), О); ( ХЕ (пвес == ЕОСКЕТ ЕККОК) гесигп (зпс)(п * (гапд() з' (1.0 + (доиь)е)КАКО ИАХ))); ) рг1пСС( Егг оп яепд()1п ); кесигп ЕХ1Т РА1ЬОКВ; 1пС вази(зпе агдс, сЬаг *агди[)) ) Доааенитюы~ые тематинескиеразделы к 1 Часть О! б/емс~сеатфорл енналразработка нролримнированиекоммрниканионныксредств Глава 22 сЬаг баеа(255) (О); спаг "епбр", тр = Херес(Р)1епаее, г ) 11[тр )= ИОЬЬ) чоьб гпСЬапб1ег(ЬОС Бгя) ( 11(ИОЬЬ )н Свеее(баха, аьгеос баеа, [Р)) Листинг 22.5.
Использование препроцессорных директив в качестве инструглента переноса. $1пс1пбе <апбьо.ь> (1пс1пбе <пьб1(Ь.Ь> (1пс1пбе <втг1пО.Ь> Ф)пс1пбе <ахвпа1.Ь> Шбет И1ИЗ2 уьпс1пбе <ч1ппосЬ.Ь> Фе1пе ухпс1пбе <гуп/Сгее.Ь> О)пс1пбе <гуа/ае1есс.Ь> Рьпс1пбе <еуе/Сурег.п> $гпс1пбе <гуг/аосхеС.Ь> (гпс1пбе <пеп)пег/(п.Ь> Фепбьс Рбе(ьпе ОВРАОЬР РтЬВ ИВМВ аа1ее.баС чо1атьье г)О атоелс С боле; Р1ЬВ лтр) спаг Р11епаее[РЬЬВИПИВ МОХ) = ОКРЬОьт Р1ЬВ ИЬМК! ппазвпеб 1опр спггепссопа1 = О; ппеьвпеб 1опв печьота1 = О! 1((агвс < 2) ( ргьпст('Ио Ше прес)11еб.
Оггпк 1 Ха1 1п Окуьвьт Рььк иьмк); е1ае ( аьгсру(Р11епаее, агуч[1)! ° Дана«ннтк ямыс текат с« нас кнс ра»/сан Я1— ! ( Часть (М а/сэс»иатформсннак ра«рабат«а прскраммнрааанас каммлннкаянан«ассар»дата Глава 22 Еуредет всгисе СОРБ 1НРО Листинг 22.7. ОЬ((Х-версия библиотеки переносимых сокетов. ( (пе виану) /«Структурный аулы Нгпдоыв требует 1пге гп(о, а ОМ1И-нет. */ /» Бабпвотека переаосаммх сохетов СОРБ дпя ОМ1И «/ ) СОРЯ 1МРО; $(пс1иде "сира.Ь Еуреде( ат се СОНМБСТИОМ тоЫ СОРБ1пхе(СОРЯ 1НРО «р1п(о) гпс аабгевв 1епдЕЬ; ( аггисг аоскаббг гп ву айбг)- /* Суррогатная фувкцвя; функцноаапьвме аоамоквоста ве требуется ОМ1И. «/ вггисе восхаддг 1п ГЬе1г аддг; гееигп; аггисг Ьовгепт 'Ье; ) поск1еп Е вгп айке; 1пе Яоскег; (пг СОРББеевовевуваве(СОМВЕСТ10Н «Соппесе1оп, сЬаг *Воат) ) СОМНКСТ10М; ( гпг Яеви11»0; Эта стр)ктура СО(Ч)ЧЕС»(О)Ч является ключом для ного кода слоя приложения Инкапсуляиия данных гй((соппесезоп->Ье=дегвовеЬупаме(вовс]] == НО(Ь) абстрактного слоя Она содерх ит экземпляры всех сокстов Беркли в структуре означает, что, хотя основ( Вевп1Е = 1; структур данных, которые потребуются для О)х!Х-вер- ная пар;шигма сокстов остается, мы больше не зависим сии кода.
Это нужно для тогск чтобы можно было пе- ог различных аспектов сокетоп Беркли на слое прило- гегогп Веви1С; ремсстить люб)ю трассировку сокстов Г>срк.п« из исход- жения. Дтзазнитезкные тематинеекиераздкеы ! Часть и! гпг СПРБВесиРгоп(СОИИБСТ1ОИ 'Соппесс1оп сваг *Бага, а1ге С г1ге) ( 1пг Вевп11 = О; гс(тест(гоп(Соппесс1оп->Босхег паса, язге, О, (вггпсг воскаппг ']ссоппасг1оп->гье1г аппг асоппесс1оп->аппгегг 1апчгп) == -1) ( Ваяп11 = 1 ) геспгп Вевп11 зпс СОРББепдто(СОИИЕСТ1ОИ *Соппесгзоп сваг *паса, агге С гага) ( 1пг Вевп11 О; 11(ваппсо(соппесс(оп->пасхах, Мемет1атБорменнакразрисовка: Ч т и; аниекоимэникационныксркдсте ! Глава 22 Листинг 22.8.
Заголовок для )))()пс(о%5-версии библиотеки переносимых сокетов 11(апас СОРБ Б Ояа11пе СОРЯ Н !зпс1пде <ягдагд.п> !(пс1ппа <Г1па.п> О(пс1ппе игпаосх.п Возможно, самым однозначным аспектом этого набора функций является то, что некоторые из них нс выполняют никаких действий. Зачем зкс тогда написаны эти кажущиеся бссполсзнычи функции? %(лдоти5-всрсия кода трсбуст выполнения действий запуска и очистки, даже если для 1)Ь))Х-всрсии в этом нот необходимости.
Тск! нс л!снсс, слой приложения будет обращаться к каким- либо функциям запуска и очистки, даже если для (з(Ч! Х такис лсйствия нс требуются, и эти функции-манекены оказываются самым простым решением. Другой важный момент состоит в том, что нскоторыс функции в СЫР8 вообще нс используются нашим приложсниск!. Они предназначены для использования в ЫЭР-приложениях. Хотя мы всс-таки оставили для них место, на %сЬ-сайгс издательства "ДиаСофт" вы найдете программу-сервер преобразования температуры и соответствующую программу-клиент, которые используют абстрактный слой СЫР8.
%)пг)оки5-порсни этих двух файлов похожи, но, сстсствснно, нс идентичны. В листинге 22.8 показана %!пс)оги5 вс)х.ия спря.)з. Доназнизнезнныо тоиатинеп иоразделы ! ! Часть Н! Л(онслзат!Лорионнанразработна нтниромчиронание комчунинационзетородстн Глава 22 Листинг 22.9. ))))(пс(оввв-версия библиотеки переносимых сокетов. ( /н Бвбпвотека перевосвавх сокетов СОРБ дпя Нспйоея *l 1пс Невп11 = О. Соппесггоп->аййгеяя 1епцГЬ = вгкеот(всгнсс воскаййг кп); (гпс1пйе соря.Ь" 11(зсоппесктоп->Ье) ( то(й СОРБ1аус(СОРЯ 1ИРО *ртп(о) Соппессгоп->пу аййг.вкп таак1у = АР 1ИЕТ; Соппесккоп->ау аййг.вкп аййг.я аййг Аййгеяя! р1пто->Регятоппео)певгей = НАЕЕНОИО(1, 1); СоппесС(оп->ву аййг.вгп ротс = Ьсопв(рокс)! ) е1яе упс СОРБЯГ Гпр(СОРЯ 1НРО *ртпсо) Соппессгоп->ГЬезг аййг.ягп (авк1у = АР 1ИЕТ; Соппессгоп->СЬекг аййг.в(п аййг НБАОАТА еваоаса; *([ЬР1И АООЕ)нСоппессгоп->Ье->Ь аййг 1гяг); ИБАягаггпр(р1п(о->тетя(опеез)пеясей, кчвапага); Соппесггоп->СЬе1г аййг.я(п ротс = Ьсопя(ротс)! 11(чваваса.чтегвуоп != р1пто->уегя1опяеопеякей) СоппесСуоп->Яосхес = восхег(АР 1ИЕТ, БОСЕ ОСЕАН, 0); гс(СоппесСЕоп->Яоскег == 1ИРАОЛО БОСЕЕТ) Ееяп1Г = 1; ( Веяп1С = 1; геспгп Иевп1Г; ) геспгп яеяп1Г! ) Мелки э и т форм еннил ра эрабиткиэ нрэыраилтриэт ни« к «минн ик ац шэн ныл кркдстк Дитынитеэ«ныл темити«елки«разделы $ « Чзсчв а! Глзез 22 гпГ СОРЯЬссеРгсоппесгьоп(сокккстьоа «Иечяоскегэ Еево11 = 1; СОИИЕСТ10И «ЯегчегСоппес11оп) ) ( г;1 Кевп11 = 01 гегпгп Кевп11; «Иечяоскет = «яегчегсоппесг(оп; > Иеыяоскег->Босгеь = вссерс(яегчегсоппесг>оп->яоскеГ, ИОЬЬ, ИОЬЬ>; гпг СОРБЯЬогкочпС11епгСоппесьзоп(СОИИЕСТ10И «Соппесйьоп, эт(И Яоскеь->Я Еег =- 1ИЧЕЬ)О ЯОСЕКт) гпг БЬосэ)ачптуре) ( ( Кевп)Ь = 1; 11(яьпгдоыптуре .= соря яаотооии кесеьче вв БЬоскочптуре .= СОРБ ЯаотООИИ яЕИО) геспгп Кево11; ( ) ЯЬпскочпТуре = СОРБ БаОТООИИ ВОТВ; (пь Соряаесч[СОИИЕСТ10И «Соппесгзоп, вьогоочп(соппесььоп->яоскеь, БЬпЫочптуре) 1 сЬвг «йвгп, вгве 1 в«ге) геьпгп О; > зпь Кево11 = О )" 11(гесч(соппесг(оп->яосгеь, гпг СОРяС1евппр(СОРЯ 1ИРО *Соре)пто> Овгв, (1пг)в>ге, Ю) == яОСККт ЕККОК) ( ( ИЯАС1еаппР(); Кево11 = 1; геьпгп О; > ) Глава 22 Ш Донскзннтекьные темат ические разделы Мсксл ~атформеннак разработка.
нрограммирониние ко клуни ационнык средстн Часть (и — т! $ ( ( СОРБ 1ИРО Свря1п1о = (0)З рггатг( сап'г ь1пб().зп )1 геьогп ЕХ)т РА1ЬОКЕ; СОИИЕСт1ОИ Бегчегеоппессгоп = (О»1 СОИИЕСт(ОИ СоппессзоптоСЬЬепг = (0»; 11(0 З= СОРБЬтвьеп(веегчегСоППЕс11оп)) сЬаг баса]255) (О)' ( сЬаг *епбр; рг1а11("Опехрессеб еггог чи11е са1)тпд 11вьеп().1п"); Р)ЬЕ *(рр СОРЯЯЬптбочп(йеегчегсоппесс(оп, СОРЯ ЯНОТООИИ ВОТН)з сьаг Рз1епаве(Р(ЬЕИАИЕ ИАХ] = ОНРАОЬТ Ртье ИАИЕ; гетпгп ЕХ1Т РА1ЬОКЕ~ ппя1дпеб 1опд соггепьтога1 = О; опвздпеб 1опд печсоса1 0; чьг 1е ( Обо пе ) з1(аг с < 2! ( д ) гт(0 != ООРБсьесхРогпага(вяегчегсоппесг(оп)) ( рггпс(( Ио 11»е прес»1(еб.
Овзвд 1 "Хв1 1п", н(0 != сОРБАссергсоппесггоа(всоппесгзоптос1зепг, ОЕРАОЬТ Р1ЬЕ ИАИЕ)~ ВяегчегСоапестзоп)) ( е1ве рг1пст( Опехрессеб еггог оп ассерс() »п"); ( е1ве вьгсру(Р11епаве, агдч]1]); ( веввег(баха, О, взвео1 баса)1 Дони ~нот ел нные тем а те теекие разде зы $Щ )! Часть [И сОРББьиебимп(сс1хепесоппесе1оп, СОРБ Бкотооии Ботв) Еи Кктт БОССКББ; Мезкпзенпдпрмеппппразрадотко п)ыераммиропониекомчлпп.ииионнытередотп ффффф Глава 22 ЙЙЛЙ Листинг <2.11. Межплатформенное приложение-клиент, использующее библиотеку СОР5. зг(0 Г= СОРБкест(ас1(епгсоппесг(оп, баеа, яххео1 баСа)) акпс1ибе <агб(о.Ь> ( )1пс1ибе <агб1зЬ.Ь> ргзп11( Опехрессеб еггог оп гест()тп ); ((пс1ибе <аггхпд.Ь> ) рггпс1("Кесегтебз Ва1п , баса); (зпс1ибе "сира.Ь" хпс Вапбоа(1пг и) ( ) гееигп ([пе)(п ' (гапб() з' (1.0 + (боиьке)клио илх)))) об этом вполне от четливое прелставзение Наиболее Резюме важный урок, который можно извлечь из этой главы, гпг аагп(гпг агдс, сЬаг еагдт[)) амми[) этой главе ыли раскр б ыты некоторые возможности вообще не имеет ничего обшего с сетевым прогр .