Понятие разделяемого кода
Сервер, рассматриваемый в приведенном примере кода, иллюстрирует весьма важный принцип. Качественная электронная книга Amazon Kindle Touch в Минске.
Проект мультипротокольного сервера позволяет создать единственную процедуру, которая отвечает на запросы к данной службе, и вызывать эту процедуру без учета того, по какому протоколу (UDP или TCP) получены эти запросы.
В рассматриваемом примере службы DAYTIME разделяемый код занимает всего несколько строк. Он был помещен в одну процедуру daytime. Однако в большинстве применяемых на практике серверов код, необходимый для. формирования ответа, может занимать сотни или тысячи строк и обычно состоит из множества процедур. Размещение всего разделяемого кода в одном месте позволяет упростить сопровождение и обеспечить идентичность службы, предоставляемой по обоим транспортным протоколам.
14.7. Параллельные мультипротокольные серверы
Как и в однопротокольном сервере службы DAYTIME, описанном ранее1, в рассматриваемом примере с мультипротокольным сервером DAYTIME используется последовательный метод обработки запросов. Причина использования последовательного решения остается той же, что и в ранее описанном сервере, предоставляющем доступ к службе DAYTIME: последовательный сервер успешно справляется со своей работой, поскольку предоставление услуг службы DAYTIME связано с выполнением минимального объема вычислений при обработке каждого запроса.
Последовательная реализация может оказаться неприемлемой для создания других служб, которые требуют большего объема вычислений при обработке каждого запроса. В подобных случаях мультипротокольный проект может быть расширен в целях обеспечения параллельной обработки запросов. В простейшем случае мультипротокольный сервер может создавать новый поток или процесс для одновременного обслуживания каждого из соединений TCP, в то время как обработка запросов UDP будет осуществляться последовательно. Мультипротокольный проект может быть также расширен в целях применения реализации, описанной в главе 13. Такая реализация предусматривает псевдопараллельную обработку запросов, поступающих через несколько соединений TCP или через сокет UDP.
14.8. Резюме
Мультипротокольный сервер позволяет проектировщику заключить весь код конкретной службы в одну программу, устранить тиражирование и упростить координацию изменений. Работа мультипротокольного сервера складывается из одного потока выполнения. В потоке открываются ведущие сокеты для работы по протоколам UDP и TCP, и для ожидания перехода одного или обоих из них в состояние готовности используется функция select. Если готов сокет TCP, сервер вызывает функцию accept для получения нового соединения и обрабатывает запросы с использованием нового сокета. Если же готов сокет UDP, сервер принимает запросы и передает ответы.
Приведенный в этой главе проект мультипротокольного сервера может быть расширен в целях обеспечения поддержки параллельных соединений TCP. Еще более важно то, что он может быть расширен для обеспечения параллельного выполнения запросов независимо от того, по какому протоколу (TCP или UDP) они поступают.
Мультипротокольные серверы позволяют устранить тиражирование кода за счет использования единой процедуры для формирования ответов на запросы к данной службе. Кроме того, мультипротокольный проект расходует меньше системных ресурсов, чем отдельные серверы (например, в нем создается меньше процессов).
Материал для дальнейшего изучения
Список прикладных протоколов наряду с перечнем портов протоколов UDP и TCP, назначенных каждому из них, приведен в документе [133].
Упражнения
- Доработайте сервер, представленный в примере данной главы, чтобы он мог обрабатывать сразу несколько запросов. Изучите некоторые из наиболее распространенных служб, которые определены для протоколов TCP/IP. Можете ли вы найти примеры, когда в мультипротоколь-ном сервере нельзя использовать для формирования ответов разделяемый код? Объясните ваш ответ.
- В этом примере кода для пользователя предусматривается возможность указать в качестве параметра имя службы или номер порта протокола, и этот параметр используется при создании пассивных сокетов для служб. Известны ли вам примеры служб, в которых для UDP используется номер порта протокола, отличный от того, что используется для TCP? Доработайте код программы, чтобы она позволяла пользователю отдельно указывать номер порта для каждого протокола.
- Сервер, рассматриваемый в данном примере, не дает возможности системному администратору определять то, какие протоколы должны в нем использоваться. Доработайте сервер и предусмотрите параметры, позволяющие администратору указывать, по какому протоколу должна предоставляться служба (по TCP, UDP или по обоим).
- Предположим, что принято решение реализовать на сетевом узле средства защиты с использованием схемы авторизации. На узле предусмотрено предоставление каждой серверной программе списка клиентских компьютеров, с которых разрешен доступ к этому серверу, и установлено правило, согласно которому сервер должен отклонять запросы, поступающие с компьютеров, не входящих в этот список. Реализуйте схему авторизации для рассматриваемого примера с мультипротокольным сервером. (Подсказка: тщательно изучите функции сокетов, чтобы понять, как они используются для работы по протоколу TCP.)