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

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

Жанры

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

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

Шрифт:

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

get_self_executable_directory
. Данную установку можно переопределить с помощью опции
– -module
(
– m
). В таком случае проверяется, является ли указанный каталог доступным.

По умолчанию развернутые сообщения не отображаются, если не указать опцию

– -verbose
(
– v
).

■ Если пользователь ввел опцию

– -help
(
– h
) или указал неправильную опцию, вызывается функция
print_usage
, которая отображает сообщение о правильном использовании программы и завершает работу.

11.3. Модули

В дополнение к основной программе созданы четыре модуля, в которых реализованы функции сервера. Чтобы создать собственный модуль, достаточно определить функцию

module_generate
, которая будет возвращать HTML-код.

11.3.1. Отображение текущего времени

Модуль

time.so
(исходный текст приведен в листинге 11.6) генерирует простую страницу, где отображается текущее время на сервере. В функции
module_generate
вызывается функция
gettimeofday
, возвращающая значение текущего времени (см. раздел 8.7, "Функция gettimeofday: системные часы"), после чего функции
localtime
и
strftime
преобразуют это значение в текстовый формат. Полученная строка встраивается в шаблон HTML-страницы page_template.

Листинг 11.6. (time.c) серверный модуль, отображающий текущее время

#include <assert.h>

#include <stdio.h>

#include <sys/time.h>

#include <time.h>

#include "server.h"

/* шаблон HTML-страницы, генерируемой данным модулем. */

static char* page_template =

 "<html>\n"

 " <head>\n"

 " <meta http-equiv=\"refresh\" content=\"5\">\n"

 " </head>\n"

 " <body>\n"

 " The current time is %s \n"

 " </body>\n"

 "</html>\n";

void module_generate(int fd) {

 struct timeval tv;

 struct tm* ptm;

 char time_string[40];

 FILE* fp;

 /* Определение времени суток и заполнение структуры типа tm. */

 gettimeofday(&tv, NULL);

 ptm = localtime(&tv.tv_sec);

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

до секунды. */

 strftime(time_string, sizeof(time_string), "%H:%M:%S", ptm);

 /* Создание файлового потока, соответствующего дескриптору

клиентского сокета. */

 fp = fdopen(fd, "w");

 assert(fp != NULL);

 /* Запись HTML-страницы. */

 fprintf(fp, page_template, time_string);

 /* Очистка буфера потока */

 fflush(fp);

}

Для удобства в этом модуле используются стандартные библиотечные функции ввода-вывода. Функция

fdopen
возвращает указатель потока (
FILE*
), соответствующий дескриптору клиентского сокета (подробнее об этом рассказывается в приложении Б, "Низкоуровневый ввод-вывод"). Для отправки страницы клиенту вызывается обычная функция
fprintf
, а функция
fflush
предотвращает потерю данных в случае закрытия сокета.

HTML-страница, возвращаемая модулем

time.so
, содержит в заголовке тэг
<meta>
, который служит клиенту указанием перезагружать страницу каждые 5 секунд. Благодаря этому клиент всегда будет знать точное время.

11.3.2. Отображение версии Linux

Модуль

issue.so
(исходный текст приведен в листинге 11.7) выводит информацию о дистрибутиве Linux, с которым работает сервер. Традиционно эта информация хранится в файле
/etc/issue
. Модель посылает клиенту Web-страницу с содержимым файла, заключенным в тэге
<pre></pre>
.

Листинг 11.7. (issue.c) Серверный модуль, отображающий информацию о дистрибутиве Linux

#include <fcntl.h>

#include <string.h>

#include <sys/sendfile.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

#include "server.h"

/* HTML-код начала генерируемой страницы. */

static char* page_start =

 "<html>\n"

 " <body>\n"

 " <pre>\n";

/* HTML-код конца генерируемой страницы. */

static char* page_end =

 " </pre>\n"

 " </body>\n"

 "</html>\n";

/* HTML-код страницы, сообщающей о том, что

при открытии файла /etc/issue произошла ошибка. */

static char* error_page =

 "<html>\n"

 " <body>\n"

 " Error: Could not open /etc/issue.\n"

 " </body>\n"

 "</html>\n";

/* Сообщение об ошибке. */

static char* error_message =

 "Error reading /etc/issue.";

void module_generate(int fd) {

 int input_fd;

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

Первый среди равных. Книга VIII

Бор Жорж
8. Первый среди Равных
Фантастика:
аниме
фантастика: прочее
эпическая фантастика
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VIII

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Наследник для дона мафии

Тоцка Тала
2. Наследники мафии
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
Наследник для дона мафии

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Князь Целитель 5

Ткачев Андрей Юрьевич
5. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 5

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Хозяин Стужи 3

Петров Максим Николаевич
3. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи 3

Тринадцатый

Северский Андрей
Фантастика:
фэнтези
рпг
7.12
рейтинг книги
Тринадцатый

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Князь Целитель 4

Ткачев Андрей Юрьевич
4. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 4

Законы Рода. Том 8

Мельник Андрей
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес