UNIX: разработка сетевых приложений
Шрифт:
Библиотека libnet автоматически записывает поле ip_len в нужном порядке байтов. Это пример повышения переносимости программы благодаря использованию библиотек.
Функция
29.8. Резюме
Символьные сокеты предоставляют возможность записывать и считывать IP-дейтаграммы, которые могут быть не поняты ядром, а доступ к канальному уровню позволяет считывать и записывать кадры канального уровня любыхтипов (не только дейтаграммы IP). Программа
В различных операционных системах применяются различные способы доступа к канальному уровню. Мы рассмотрели пакетный фильтр Беркли, DLPI SVR4 и пакетные сокеты Linux (
Отправка символьных дейтаграмм осуществляется в разных системах по-разному. Свободно распространяемая библиотека
Упражнения
1. Каково назначение флага
2. При работе программы
Глава 30
Альтернативное устройство клиента и сервера
30.1. Введение
При написании сервера под Unix мы можем выбирать из следующих вариантов управления процессом:
Наш первый сервер, показанный в листинге 1.5, был последовательным( iterative), но количество сценариев, для которых этот вариант является предпочтительным, весьма ограничено, поскольку последовательный сервер не может начать обработку очередного клиентского запроса, не закончив полностью обработку текущего запроса.
В листинге 5.1 показан первый в данной книге параллельный( concurrent) сервер, который для обработки каждого клиентского запроса порождал дочерний процесс с помощью функции
В разделе 6.8 мы разработали другую версию сервера TCP, в котором имеется только один процесс, обрабатывающий любое количество клиентских запросов с помощью функции
В листинге 26.2 мы модифицировали параллельный сервер, создав для каждого клиента по одному потоку вместо одного процесса.
В этой главе мы рассмотрим два других способа модификации устройства параллельного сервера.
Предварительное создание дочерних процессов( preforking). В этом случае при запуске сервера выполняется функция
Предварительное создание потоков( prethreading). При запуске сервера создается некоторое количество (пул) потоков, и для обработки каждого клиента используется поток из данного набора.
В данной главе мы будем рассматривать множество вопросов, связанных с предварительным созданием потоков и процессов. Например, что произойдет, если в пуле окажется недостаточное количество процессов или потоков? А если их будет слишком много? Как родительский и дочерние процессы (или потоки) синхронизируют свои действия?
Обычно написать клиент легче, чем сервер, за счет простоты управления процессом клиента. Тем не менее мы уже исследовали различные способы написания простого эхо-клиента, которые вкратце изложены в разделе 30.2.
В этой главе мы рассматриваем девять различных способов устройства сервера и взаимодействие каждого из этих серверов с одним и тем же клиентом. Клиент-серверный сценарий типичен для WWW: клиент посылает небольшой по объему запрос, а сервер отвечает ему, отсылая соответствующие запросу данные. Некоторые из этих серверов мы уже достаточно подробно обсуждали (например, параллельный сервер, вызывающий функцию