Программирование для 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
рейтинг книги
На границе империй. Том 7. Часть 2
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
Звездная Кровь. Изгой
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Хозяин Теней 4
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки
Фантастика:
фэнтези
5.00
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Метатель
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Моя на одну ночь
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Чехов. Книга 2
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Хозяин Теней 2
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Сумеречный стрелок 7
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Жизнь под чужим солнцем
Детективы:
прочие детективы
9.10
рейтинг книги
Красноармеец
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60