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

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

Жанры

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

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

Шрифт:

/* Отправка его клиенту. */

write(connection_fd, response, strlen(response));

 } else {

/* Запрашиваемый модуль успешно загружен. */

/* Выдача HTTP-ответа, обозначающего успешную обработку

запроса, и HTTP-заголовка для HTML-страницы. */

write(connection_fd, ok_response, strlen(ok_response));

/*
Вызов модуля, генерирующего HTML-код страницы и

записывающего этот код в указанный файл. */

(*module->generate_function)(connection_fd);

/* Работа с модулем окончена. */

module_close(module);

 }

}

/* Обработка клиентского запроса на подключение. */

static void handle_connection(int connection_fd) {

 char buffer[256];

 ssize_t bytes_read;

 /* Получение данных от клиента. */

 bytes_read =

read(connection_fd, buffer, sizeof(buffer) — 1);

 if (bytes_read > 0) {

char method[sizeof(buffer)];

char url[sizeof(buffer)];

char protocol[sizeof(buffer)];

/* Часть данных успешно прочитана. Завершаем буфер

нулевым символом, чтобы его можно было использовать

в строковых операциях. */

buffer[bytes_read] = '\0';

/* Первая строка, посылаемая клиентом, -- это HTTP-запрос.

В запросе указаны метод, запрашиваемая страница и

версия протокола. */

sscanf(buffer, "%s %s %s", method, url, protocol);

/* В заголовке, стоящем после запроса, может находиться

любая информация. В данной реализации HTTP-сервера

эта информация не учитывается. Тем не менее необходимо

прочитать все данные, посылаемые клиентом. Данные читаются

до тех пор, пока не встретится конец заголовка,

обозначаемый пустой строкой. В HTTP пустой строке

соответствуют символы CR/LF. */

while (strstr(buffer, " \r\n\r\n") == NULL)

bytes_read = read(connection_fd, buffer, sizeof(buffer));

/* Проверка правильности последней операции чтения.

Если она не завершилась успешно, произошел разрыв

соединения, поэтому завершаем работу. */

if (bytes_read == -1) {

close(connection_fd);

return;

}

/* Проверка поля версии. Сервер понимает протокол HTTP

версий 1.0 и 1.1. */

if (strcmp(protocol, "HTTP/1.0") &&

strcmp(protocol, "HTTP/1.1")) {

/* Протокол не поддерживается. */

write(connection_fd, bad_request_response,

sizeof(bad_request_response));

} else if (strcmp (method, "GET")) {

/* Сервер реализует только метод GET, а клиент указал

другой метод. */

char response[1024];

snprintf(response, sizeof(response),

bad_method_response_template, method);

write(connection_fd, response, strlen(response));

} else

/* Корректный запрос. Обрабатываем его. */

handle_get(connection_fd, url);

 } else if (bytes_read == 0)

/* Клиент разорвал соединение, не успев отправить данные.

Ничего не предпринимаем */

;

 else

/* Операция чтения завершилась ошибкой. */

system_error("read");

}

void server_run(struct in_addr local_address, uint16_t port) {

 struct sockaddr_in socket_address;

 int rval;

 struct sigaction sigchld_action;

 int server_socket;

 /* Устанавливаем обработчик сигнала SIGCHLD, который будет

удалять завершившееся дочерние процессы. */

 memset(&sigchld_action, 0, sizeof(sigchld_action));

 sigchld_action.sa_handler = &clean_up_child_process;

 sigaction(SIGCHLD, &sigchld_action, NULL);

 /* Создание TCP-сокета */

 server_socket = socket(PF_INET, SOCK_STREAM, 0);

 if (server_socket == -1) system_error("socket");

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

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

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец