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

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

Шрифт:

(void(*)int))dlsym(handle,

"module_generate");

 /* Проверяем, найдена ли константа. */

 if (module_generate == NULL) {

/* Константа отсутствует в библиотеке. Очевидно, файл не

является серверным модулем. */

dlclose(handle);

return NULL;

 }

 /* Выделение и инициализация объекта server_module. */

 module =

(struct server_module*)xmalloc

(sizeof (struct server_module));

 module->handle = handle;

 module->name = xstrdup(module_name);

 module->generate_function = module_generate;

 /* Успешное завершение функции. */

 return module;

}

void module_close(struct server_module* module) {

 /* Закрытие библиотеки. */

 dlclose(module->handle);

 /* Удаление строки с именем модуля. */

 free((char*)module->name);

 /* Удаление объекта module. */

 free(module);

}

Каждый модуль содержится в файле совместно используемой библиотеки (см. раздел 2.3.2, "Совместно используемые библиотеки") и должен экспортировать функцию

module_generate
. Эта функция генерирует HTML-код Web-страницы и записывает его в сокет, дескриптор которого передан ей в качестве аргумента.

В файле

module.c
определены две функции.

■ Функция

module_open
пытается загрузить серверный модуль с указанным именем. Файл модуля имеет расширение
.so
, так как это совместно используемая библиотека. Функция открывает библиотеку с помощью функции
dlopen
и ищет в библиотеке константу
module_generate
посредством функции
dlsym
(описаны в разделе 2.3.6, "Динамическая загрузка и выгрузка"). Если библиотеку не удалось открыть или в ней не обнаружена экспортируемая константа
module_generate
, возвращается значение
NULL
. В противном случае выделяется и возвращается объект
module
.

■ Функция

module_close
закрывает совместно используемую библиотеку, соответствующую указанному модулю, и удаляет объект
module
.

В файле module.c определена также глобальная переменная module_dir. В ней записано имя каталога, в котором функция module_open будет искать совместно используемые библиотеки.

11.2.3. Сервер

Файл

server.c
(листинг 11.4) представляет собой реализацию простейшего HTTP-сервера.

Листинг 11.4. (server.c) Реализация HTTP-сервера

#include <arpa/inet.h>

#include <assert.h>

#include <errno.h>

#include <netinet/in.h>

#include <signal.h>

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/wait.h>

#include <unistd.h>

#include "server.h"

/* HTTP-ответ и заголовок, возвращаемые в случае

успешной обработки запроса. */

static char* ok_response =

 "HTTP/1.0 100 OK\n"

 "Content-type: text/html\n"

 "\n";

/* HTTP-ответ, заголовок и тело страницы на случай

непонятного запроса. */

static char* bad_request_response =

 "HTTP/1.0 400 Bad Reguest\n"

 "Content-type: text/html\n"

 "\n"

 "<html>\n"

 " <body>\n"

 " <h1>Bad Request</h1>\n"

 " This server did not understand your request.\n"

 " </body>\n"

 "</html>\n";

  • Читать дальше
  • 1
  • ...
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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