Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

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

Шрифт:

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

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' },

 { "help", 0, NULL, 'h' },

 { "module-dir", 1, NULL, 'm' },

 { "port", 1, NULL, 'p' },

 { "verbose", 0, NULL, 'v' },

};

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

static const char* const short_options = "a:hm:p:v";

/* Сообщение о том, как правильно использовать программу. */

static const char* const usage_template =

 "Usage: %s { options }\n"

 " -a, --address ADDR Bind to local address (by default, bind\n"

 " to all local addresses).\n"

 " -h, --help Print this information.\n"

 " -m, --module-dir DIR Load modules from specified directory\n"

 " (by default, use executable directory).\n"

 " -p, --port PORT Bind to specified port.\n"

 " -v, --verbose Print verbose messages.\n";

/* Вывод сообщения о правильном использовании программы

и завершение работы. Если аргумент IS_ERROR не равен нулю,

сообщение записывается в поток stderr и возвращается

признак ошибки, в противном случае сообщение выводится в

поток stdout и возвращается обычный нулевой код. */

static void print_usage(int is_error) {

 fprintf(is_error ? stderr : stdout, usage_template,

program_name);

 exit(is_error ? 1 : 0);

}

int main(int argc, char* const argv[]) {

 struct in_addr local_address;

 uint16_t port;

 int next_option;

 /* Сохранение имени программы для отображения в сообщениях

об ошибке. */

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

Кодекс Охотника. Книга XXXIX

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX

Я до сих пор царь. Книга XXXII

Дрейк Сириус
32. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор царь. Книга XXXII

Барон ненавидит правила

Ренгач Евгений
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Барон ненавидит правила

Представь себе… Беседы о деньгах, политике и жизни вообще

Гьямцхо? Нгагва?нг Ловза?нг Тэнцзи?н
Религия и эзотерика:
самосовершенствование
5.00
рейтинг книги
Представь себе… Беседы о деньгах, политике и жизни вообще

Точка Бифуркации VI

Смит Дейлор
6. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.40
рейтинг книги
Точка Бифуркации VI

Свадьба на выбор, или Женихи в ассортименте

Царева Маша
Любовные романы:
современные любовные романы
7.71
рейтинг книги
Свадьба на выбор, или Женихи в ассортименте

Неучтенный элемент. Том 10

NikL
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Неучтенный элемент. Том 10

Литрпг

Казначеев Виктор
5.00
рейтинг книги
Литрпг

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Тринадцатый

Записки уцелевшего

Голицын Сергей Михайлович
Документальная литература:
биографии и мемуары
7.00
рейтинг книги
Записки уцелевшего

Мифы и правда о плане Барбаросса

Веремеев Юрий Георгиевич
Анатомия армии
Научно-образовательная:
история
5.00
рейтинг книги
Мифы и правда о плане Барбаросса

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Игра киллера

Бонансинга Джей
Детективы:
боевики
6.25
рейтинг книги
Игра киллера

Законы рода

Мельник Андрей
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
4.75
рейтинг книги
Законы рода