Мультипротокольные серверы (TCP, UDP)

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

14.1. Введение

В предыдущей главе было описано, как построить сервер, в котором один поток выполнения осуществляет асинхронный ввод/вывод для обеспечения псевдопараллельного обслуживания нескольких соединений. В этой главе эта тема рассматривается более подробно. В ней показано, как можно обеспечить поддержку нескольких транспортных протоколов с использованием одного потока выполнения. Рассматриваемые принципы иллюстрируются на примере с сервером, предоставляющим доступ к службе DAYTIME и по протоколу UDP, и по протоколу TCP. Хотя сервер, представленный в этом примере, выполняет запросы последовательно, рассматриваемый основной принцип обобщается и распространяется непосредственно на серверы, которые обрабатывают запросы параллельно. Znakomstva-s-p мета знакомства в одессе.

14.2. Чем обусловлено стремление уменьшить количество серверов

В большинстве случаев каждый конкретный сервер обрабатывает запросы к одной службе, доступ к которой предоставляется через один транспортный протокол. Например, в компьютерной системе, предоставляющей доступ к службе DAYTIME, часто работают два сервера; один из них обрабатывает запросы, поступающие по протоколу UDP, а другой — запросы, поступающие по протоколу TCP.

Основное преимущество использования отдельного сервера для каждого протокола связано с тем, что такими серверами легко управлять. Системный администратор всегда может распорядиться тем, какие протоколы будут поддерживаться компьютером, управляя запуском и остановом соответствующих серверов в процессе работы системы. Основной недостаток использования отдельного сервера для каждого протокола связан с тиражированием серверов. Поскольку доступ ко многим службам может предоставляться либо по протоколу UDP, либо по протоколу TCP, для каждой службы требуется два сервера. Кроме того, поскольку и в серверах UDP, и в серверах TCP используется один и тот же основной алгоритм формирования ответа, оба они содержат одинаковый код обработки запроса и подготовки ответа. Так как обе программы содержат одинаковый код, обеспечивающий предоставление доступа к конкретной службе, сопровождение и отладка программного обеспечения могут стать утомительными. Программист, занимаясь исправлением ошибок или сменяя серверы в соответствии с новыми выпусками системного программного обеспечения, должен следить за тем, чтобы обе серверные программы оставались одинаковыми. Кроме того, системный администратор должен тщательно координировать эксплуатацию серверов TCP и UDP одной и той же службы для обеспечения того, чтобы они одновременно предоставляли доступ к службе, соответствующей одной и той же версии спецификации данной службы. Еще один недостаток использования отдельных серверов для каждого протокола связан с непроизводительным использованием ресурсов: многочисленные серверные процессы (или потоки) напрасно занимают записи таблицы процессов и другие системные ресурсы. Масштабы этой проблемы становятся очевидными, если учесть, что в стандартах TCP/IP определены десятки служб.

14.3. Проект мультипротокольного сервера

Мультипротокольный сервер состоит из одного потока выполнения, в котором используется асинхронный ввод/вывод для обслуживания соединений по протоколу UDP или TCP. В этом сервере первоначально открываются два сокета; в одном применяется транспортный протокол без установления логического соединения (UDP), а в другом — транспортный протокол с установлением логического соединения (TCP). Затем в сервере используются средства асинхронного ввода/вывода для получения информации о готовности к работе одного из сокетов. Если готов к работе сокет TCP, это означает, что от одного из клиентов поступил запрос на установление соединения TCP. Сервер вызывает функцию accept для получения нового соединения, а затем обменивается данными с клиентом через это соединение. Если же готов сокет UDP, это означает, что один из клиентов передал запрос в форме дейтаграммы UDP. В сервере для чтения запроса и регистрации адреса оконечной точки отправителя используется функция recvfrom. После формирования ответа сервер отправляет этому клиенту ответ с помощью функции sendto.

Похожие статьи