Проект мультисервисного сервера с установлением логического соединения

Опубликовано в Технологии > Серверные технологии

Рассматриваемый мультисервисный сервер с установлением логического соединения также работает по последовательному алгоритму. Вообще, такой сервер выполняет те же задачи, что и ряд последовательных серверов с установлением логического соединения. Точнее, в данном случае один поток выполнения мультисервисного сервера заменяет ведущие потоки целого ряда серверов с установлением логического соединения. На самом верхнем уровне организации работы в мультисервисном сервере для выполнения его функций применяется асинхронный ввод/вывод. Схема организации процессов сервера приведена на рис. 15.2. В любой момент времени в одном потоке управления имеется один открытый сокет для каждой службы, а для обслуживания конкретного соединения открыт лишь один дополнительный сокет.

Схема организации процессов последовательного мультисервисного сервера с установлением логического соединения

Начиная выполнение, мультисервисный сервер создает один сокет для каждой предоставляемой им службы, привязывает каждый сокет к общепринятому порту данной службы, а затем вызывает функцию select для перехода в состояние ожидания входящих запросов на установление соединения через любой из этих сокетов. Если готов один из сокетов, сервер вызывает функцию accept для получения нового соединения, выполняя поступивший запрос. Функция accept создает новый сокет для входящего соединения. Сервер использует новый сокет для обмена данными с клиентом, а затем закрывает его. Поэтому кроме одного ведущего сокета для каждой службы, в сервере в любое время открыто не более одного дополнительного сокета.

Как и в случае с сервером без установления логического соединения, в данном сервере также ведется таблица соответствия, позволяющая определить способ обработки каждого входящего соединения. Начиная работу, сервер распределяет ведущие сокеты. Для каждого ведущего сокета сервер вносит запись в таблицу соответствия с указанием номера сокета и процедуры, реализующей службу, доступ к которой предоставляется через этот сокет. После распределения ведущего сокета для каждой службы сервер вызывает функцию select для перехода в состояние ожидания запросов на установление соединения. После поступления такого запроса сервер использует таблицу соответствия для определения того, какая из многих внутренних процедур должна быть вызвана для поддержки службы, затребованной клиентом.

15.5. Параллельный мультисервисный сервер с установлением логического соединения

Процедура, вызываемая мультисервисным сервером при получении запроса на установление соединения, может сама принимать и обслуживать новое соединение (и в этом случае сервер становится последовательным) или создавать ведомый процесс для обработки этого запроса (в таком случае сервер становится параллельным). По существу, мультисервисный сервер может быть запрограммирован на последовательную поддержку одних служб и параллельную поддержку других; программист не обязан выбирать единый t способ организации всех служб. Как и в описанных выше параллельных серверах, параллельная работа может быть обеспечена с использованием нескольких однопотоковых процессов или одного многопотокового процесса. На рис. 15.3 показана схема организации процессов/потоков в мультисервисном сервере, в котором применяется параллельная реализация с установлением логического соединения.

Как и в последовательной реализации, сразу после завершения взаимодействия с клиентом процедура закрывает используемое ею новое соединение. В случае параллельной реализации ведущий процесс сервера закрывает соединение сразу после создания им ведомого процесса; соединение остается открытым в ведомом процессе. Ведомый процесс работает точно так же, как и ведомый процесс в обычном параллельном сервере с установлением логического соединения: он взаимодействует с клиентом через соединение, выполняя запросы и отправляя ответы. Закончив сеанс взаимодействия, ведомый процесс закрывает сокет, тем самым завершая обмен данными с клиентом, и заканчивает работу.