В. Столлингс - Современные компьютерные сети (2-е издание, 2003) (1114681), страница 166
Текст из файла (страница 166)
Данный пример несложно преобразовать в более реальную серверную программу, поместив соответствующие строки в бесконечный цикл, условие завершения которого никогда не выполняется (например, вййе(1)(...)). Такай сервер создаст один постоянный сокет с помощью функции восие1(), тогда как временные сокеты будут создаваться каждый раз, когда принимается запрос. Таким образом, каждый временный сокет будет отвечать за поддержание одного входящего соединения, Если в конце концов сервер прекратит свою работу, постоянный сокет будет закрьтт, так же как и все активные временные сокеты.
Доступность тога же номера порта для повторного использования другими прилажениялги определяется реализацией протокола ТСР. Такой парт будет находиться в состоянии ПИЕ)1/Я[Т в течение некоторого заранее определенного периода времени, как показано на рис, Б.1 для порта 1234.
Б.б. Потоковые и дейтаграммные сокеты Для передачи ориентированных на соединение надежных потоков байтов между машинами используются аскеты типа 5ОЕК 5[кЕАИ. [чак уже говорилось ранее, в некоторых случаях перед использованием сокеты должны быть соединены. В зтам случае данные передаются по двунаправленным потокам байтов, и гарантируется прибытие данных в правильном порядке. Сакеты типа ВОСК 06ВАИ (дейтаграммные сокеты) также поддерживают двунаправленный поток данных, но данные могут прибывать не в том порядке, в котором ани были отправлены, а также могут дублироваться (то есть не гарантируется сохранение порядка поступления данных и их уникальность). Дейтаграммные сокеты также не предоставляют надежной службы, так как данные могут быть потеряны.
Однако важно отметить, что сохраняются границы записей данных, если длина записей не превышает размера буфера пол1<тателя. В отличие от потоковых сакетов, дейтаграмлтные со кеты не требуют установки соединений. Таким образом, не нужно устанавливать соединение перед их применением. [!а рнс. Б.З показана блок-схема взаимодействгля сокетов. Если сравнить данную схему с потоковой Б.Б.
Потоковые и дейтаграммные соквты 727 моделью взаимодействия, можно заметить, чта здесь не используются функции йвгеп() н ассерго, а вместо функций вел()() и гесч() применяются функции вепгйо() и тесы(гашО. Рис. Б.З. Блок-схема взаимодействия дейтаграммных сокетов Пример клиентской программы 0РР /Иег1пе И1И // щм для и1пвосх и В50 для сокетов В50 //тпс1и1е <5ГФОЧМ> // нуино дпя рпп(П) Жпс1ОЦО <51гтпй.п> // нУИНО ДЛЯ ПВЯСРУО И 51ГСРУ() фтгпет И)Н (/1ПС1цбе члпцоив.п> П нуино для Итпвасй (/етя) т Г Ищет В50 ф1пс1иое <вув/гуров.п> // нуяио для идентификатодов, определяеных сишеной й)пс1цце <пес1пег/1п.ь> и нуино ддя шруктуры интернет-адресов йпс1ыое <агра/тпег.п> и нуыно для тпег пгоа() (/тпс1цце <5У5/5ОСИЕг.п> // нувно для воСИЕ(О Ьтпш ) и т. д.
Гипс1цое <Гсп11.П> [/1пс1цое спегЦЬ.Ь~ //епдтт /)Оегтпе РОВТ ИОИ 1050 // попер порта серведа фце/1пе 1Р АООВ "131.247. 167. 101" // 1Р-адрес сервера (фиксированный) чотй иатп(чо10) Ф1(ОЕТ ЩИ ИОРО ийег51опйеоцевгвд = МДИЕИОДШ!.1). // фУнкЦии И5Д И5ДОАТА нваОага; // фуннции И5А Фепси Г цпвтйпец тпт зегчег 5; // дескриптор сонета сервера 51гцст восяаццг тп вегчег абцг. // Интернет-адрес сервера сдаг оцг Ьц(11001: П выходной буфер для данных спаг тп Ьцт(1001: // входной буфер для данных 72З Приложение Б. Сокеты Бтй Потоковые и дейтаграммные сокеты 729 // создать сокет ьегчег ь = ьоскет(АЕ !иет. 5ССк 5тИЕди.
О): // заполнить адрес сокета сервера ЬЕГЧЕГ аббтгнл Тащ1)у = АГ (ИЕТ; // ИСПОЛЬЗУЕИОЕ СЕНЕйотаа адрЕСОВ ьегчег аббг.ьтп рагс - Ьтопь(РРЙТ МОИ); П используений нокер порта ьегчег аббг.ьтг; аббг.ь абб = 1пе" аббг(Тает псоа(аббгеьь)): // используеный 1Р-адрес // заполнить буфер ацс Ьцг сообцениеи ььгсру(оц( ьцг, "сообщение от клиента серверу">; // отправить сообщение серверу. "-1" позволяет включить // сиивол конца строки ьепбта(ьегчег ь, оц! ьцг. (ь(г1еп(ацт ьцт) + 1). с, (ьтгцст ьаскасыг *)кьегчег а!ыг, ь)зеодьегчег аббг)); // вывести полученное си!Сценке рг1птп 'Оолученное сообщение: 'дь' >п". тп ьцг): // закрыть все откритые сокеты //!Гбет И)И с1оьеьасхе((ьегчег ь): //епб! Г />1(бет ВВО с1оьеЬегчег ь); //епб! г к!гбет И1И // очистить сонет И5АО еапцр(): (/епб!т ) Пример серверной программы 00Р (/бег!пе И1И йпс1цбе <ьтбта,п» //(пс)цбе -ьтгтпС.Ь» в!/бе/ И>И //!пс1цбе <ьппбоиь,п» !)епб ! т />1гбег В50 Йпс1цбе <ьуь/1уреь.п» (/тпс1цбе <пес!песни.
И» //!пс)цбе <агра/тпеы Ь» //!пс1цбе <ьуь/ьасиет.ь» //тпс)цбе «Гспт) Ь» (/!пс1цбе <петбб.п» (/епбт( // И1И дгя И1пьоск и В50 аля сокетов ВЯ) // нувно для ргтп(Т() // нувно для !вовс)у() и ьтгсру() // нувно дгя И!папок // нувно П нувно !/ нумно П нуино для идентификаторов.
определяеиих систеной для структуры Интернет-адресов для !лет птоа() для ьоскет(>. Ыпб() и т. л. !Ые/тпе Рбйт иОи 1050 // используеный манер парта (Ыет)пе !Р ЛРОИ "131.247.167.10!" // 1Р-адрес клиента чояб ца1п(чо1б) //!тает И!И П подовдать получения сосбцения аббг 1еп = ьтзеот(ьегчег асЫг); гесчтгов(ьегчег ь. Ул ЬЦТ, ь1зеот(тп Ьц().
С. (ьтгцст ьосйаббг *)Кьегчег асЫг. Каббг )еп). ИСЖО ичег51опйеццеьбеб = ИАКЕ$6РР(1.1); // Дпя фунКЦиЙ ИВА ИВАСАТА иьаРата: // для фуннций И5А /)спбтт // дескриптор сонета сервера // Интернет-адрес серверз /! Интернет-адрес клиента // длина Интернет-адреса // выходной буфер для данных // входной буфер для данных П счетчин циклов цпь10пеб 1гс ьегче! ти ьбгцст ьосиаббг 1п ьегчег аббг: ь(гост ьсскабб 1п с)1епт атЫг.
!п! дббг 1еп; слаг оць Ьц/ПСС>: спаг тп Ьцт(1001; 1опй (пс 1: /)!Убег И1И // инициализировать сокет И5/5(агбар(итога!опйеццеьтеб ВиьаОата): ((епбтт // создать сонет // АГ 1ИЕТ - сенейство адресов Интернета. а 5ССК ССЙАИ - дейтагранна ьегче~ ь = ьсскет(АЕ 1ИЕТ, 5ОСК РСИАИ, С): // заполнить адресной информацией структуру секста сервера ьегчег аббггип тавп 1у - АГ 1иГТ: // сеиейство адресов ьегчег аббг.ьы рагс = Птопь(РОЙТ Н>И): // попер порта ьегчег аббг.ь1п атыг.ь аббг = лтоп1(1МАОРВ лит>; // прослуыивать все 1Р-адреса Ыш>(ьегчег ь, (ьйгцст ьоскаббг *)Вьегчег аббг.
м геодьегчег атЫг)); // заполнить адресной инфориацией структуру сокета клиента с)1епт аббг.ь1п Гаяп 1У - АГ 1ИЕТ; П используеное сеиейство адресов с1!опт аббглип рагс - Ьтапь(рбйт ици). П используемый номер парта с)тепс аббг.ьтп аббг.ь аббг - !пет аббг( 1Р АРОИ): /! используеиый 1Р-адрес // оыидать получения сообцения от клиента асЫг 1еп - ь1хеодс1тепт аЫг); гесчтгов(ьегчег ь.
(п ЬЦТ. извод!и Ьцт), О, Ьтгцст ьтскаббг *)Кс>!еп( аббг. Касбг 1еп): // вывести полученное сосбценне рг(пСП "Полученное саобцение: 'ьь Ьп", тг Ьцт). /! цикл задервни. предоставляющий время клиенту Гог (1-0; !»» 5тер //5 ««' !/ отправить сообщение клиенту. "+1" позволяет включить // сиивол конца страни ЬЕПССОЬЕГЧЕГ Ь. Оцт Ьцт, ЬСГ1ЕП(ацт Ьцт) + 1). С. (ЬЬГЦСЬ Ьаокаббт ь)ВС11ЕПС аббГ. ьтзеодс11епт аббг)); П закрыть все открытые сокеты (/1/бе/ И)И с1оьеьоскет(ьегчег ь); Депо!/ Ф1/бе( ВВО с1оье(ьегчег ь); (/епбтт //!Гает И!И П очистить соне~ ИВАС1еапцр(): Фепбтт в ) ' В атой отроке несколько сыьгтак<ьтческнх сшибок.
Датвлвтъся, чта имел в виду автор, невовьтохтпо— Ллимеч. нврвв. ТЗО Приложение Б. Сокеты </1пс1цое <ьшшо.ь> // для ргштп) 01пс1цбе <ьуь/юцпв1.ь> // для ьшас(1оп() //!пс1цбе <питьем.Ь> // для ранье() иы 1е(с1!еп! ь = вссер(<ь. ИНИ.. ИОЕО > 0) // сброс флзгов Ьапб1ег.ьа П вдь = 0; Б.б. Управление программой во время выполнения Неблокирующие обращения к сокетам Но умолчанию сокет создается как блокирующий (то есть он не возвращает управления обратившейся к нему программе до тех пор, пока не будет выполнена вызываемая функция).
Например, если мы обращаемся к функции ассер[() сокета. процесс будет заблокирован, пока от клиента ие поступит запрос на соединение. В операционной системе П)ч(1Х есть две функции, позволяюпвие превратить блокирующий сокет в неблокирующий: !оса() и ье(есЦ). Функция тосЫ() облегчает управление вводом-выводом файла или сонета Затем с помощью функции де[ее[О можно определить состояние секста, то есть его готовность или неготовность к выполнению действия: // изменение блокирующего сосшяния сонета цпьтдпеб 1опц цпыосй = ТЙНЕ; // ТИНЕ для неблокируюцего. ЕЛ[5Е для блокирующего !ось!(ь.
Г!ОИВ10. Вцпв!оск): Затем периодически вызывается функция ассерЕ(): тт (с1<епт ь =- ЕШОВЕОВИХК) // ждать, пака не прибудет запрос на соединение от клиента, // тен врененен выполняя полезные действия е1ье // обработать поступивший запрос соединения // вывести сообщение об ошибке и прекратить работу Также можно использовать функцию ье(есЕО, чтобы опросить состояние сокета, как зто делается в следуюшел! фрагменте программы с использованием неблакируюшега сокета: гб (ье1ест(яшх беьсг > 1.