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

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

Листинг 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"
 "  <p>The current time is %s </p>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 секунд. Благодаря этому клиент всегда будет знать точное время.

Оглавление книги


Генерация: 1.201. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз