Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

close(connection);

exit(0);

} else if (child_pid > 0) {

/* Это родительский процесс. Дескриптор клиентского сокета

ему не нужен. Переход к приему следующего запроса. */

close(connection);

} else

/* Вызов функции fork завершился неудачей. */

system_error("fork");

 }

}

В файле

server.c
определены следующие функции.

■ Функция

server_run
является телом сервера. Она запускает сервер и начинает принимать запросы на подключение, не завершаясь до тех пор, пока не произойдет серьезная ошибка. Сервер создает потоковый TCP-сокет (см. раздел 5.5.3, "Серверы").

Первый аргумент функции

server_run
определяет локальный адрес, по которому принимаются запросы. У компьютера может быть несколько адресов, каждый из которых соответствует определённому сетевому интерфейсу. [37] Данный аргумент ограничивает работу сервера конкретным интерфейсом или разрешает принимать запросы отовсюду, если равен
INADDR_ANY
.

37

В системе могут присутствовать такие интерфейсы, как

eth0
(Ethernet-плата),
lo
(интерфейс обратной связи),
ppp0
(коммутируемое соединение).

Второй аргумент функции

server_run
— это номер порта сервера. Если порт уже используется или является привилегированным, работа сервера завершится. Когда номер порта задан равным нулю. ОС Linux автоматически выберет неиспользуемый порт.

Для обработки каждого клиентского запроса сервер создает дочерний процесс с помощью функции

fork
(см. раздел 3.2.2. "Функции
fork
и
exec
"), в то время как родительский процесс продолжает принимать новые запросы. Дочерний процесс вызывает функцию
handle_connection
, после чего закрывает соединение и завершается.

■ Функция

handle_connection
обрабатывает отдельный клиентский запрос, принимая в качестве аргумента дескриптор сокета. Функция читает данные из сокета и пытается интерпретировать их как HTTP-запрос на получение страницы.

Сервер обрабатывает только запросы протокола HTTP версий 1.0 и 1.1. Столкнувшись с иными протоколом или версией сервер возвращает HTTP-код 400 и сообщение

bad_request_response
. Сервер понимает только HTTP-метод GET. Если клиент запрашивает какой-то другой метод, сервер возвращает HTTP-код 501 и сообщение
bad_method_response_template
.

■ Если клиент послал правильно сформированный запрос GET, функция

handle_connection
вызывает функцию
handle_get
, которая обрабатывает запрос. Эта функция пытается загрузить серверный модуль, имя которого генерируется на основании имени запрашиваемой страницы. Например, когда клиент запрашивает страницу с именем "information", делается попытка загрузить модуль
information.so
. Если модуль не может быть загружен, функция
handle_get
возвращает HTTP-код 404 и сообщение
not_found_response_template
.

В случае обращения к верной странице функция

handle_get
возвращает клиенту HTTP-код 200, указывающий на успешную обработку запроса, и вызывает функцию
module_generate
, содержащуюся в модуле. Последняя генерирует HTML-код Web-страницы и посылает его клиенту.

■ Функция

server_run
регистрирует функцию
clean_up_child_process
в качестве обработчика сигнала
SIGCHLD
. Обработчик просто очищает ресурсы завершившегося дочернего процесса (см. раздел 3.4.4. "Асинхронное удаление дочерних процессов").

11.2.4. Основная программа

В файле

main.c
(листинг 11.5) содержится функция
main
сервера. Она отвечает за анализ аргументов командной строки и обнаружение ошибок в них, а также за конфигурирование и запуск сервера.

Листинг 11.5. (main.c) Главная серверная функция, выполняющая анализ аргументов командной строки

#include <assert.h>

#include <getopt.h>

#include <netdb.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/stat.h>

#include <unistd.h>

#include "server.h"

/* Описание длинных опций для функции getopt_long. */

static const struct option long_options[] = {

 { "address", 1, NULL, 'a' },

  • Читать дальше
  • 1
  • ...
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: