Пример: сервер времени и даты

Пример: сервер времени и даты

В листинге 11.7 показан наш сервер времени и даты из листинга 4.2, переписанный с использованием функции tcp_listen.

Листинг 11.7. Сервер времени и даты, переписанный с использованием функции tcp_listen

//names/daytimetcpsrv1.c

 1 #include "unp.h"

 2 #include <time.h>

 3 int

 4 main(int argc, char **argv)

 5 {

 6  int listenfd, connfd;

 7  socklen_t addrlen, len;

 8  char = buff[MAXLINE];

 9  time_t ticks;

10  struct sockaddr_storage cliaddr;

11  if (argc != 2)

12   err_quit("usage: daytimetcpsrv1 <service or port#>");

13  listenfd = Tcp_listen(NULL, argv[1], &addrlen);

14  for (;;) {

15   len = sizeof(cliaddr);

16   connfd = Accept(listenfd, (SA*)&cliaddr, &len);

17   printf("connection from %s ", Sock_ntop((SA*)&cliaddr, len));

18   ticks = time(NULL);

19   snprintf(buff, sizeof(buff), "%.24s ", ctime(&ticks));

20   Write(connfd, buff, strlen(buff));

21   Close(connfd);

22  }

23 }

Ввод имени службы или номера порта в качестве аргумента командной строки

11-12 Нам нужно использовать аргумент командной строки, чтобы задать либо имя службы, либо номер порта. Это упрощает проверку нашего сервера, поскольку связывание с портом 13 для сервера времени и даты требует прав привилегированного пользователя.

Создание прослушиваемого сокета

13 Функция tcp_listen создает прослушиваемый сокет. В качестве третьего аргумента мы передаем нулевой указатель, потому что нам безразличен размер структуры адреса, используемого данным семейством: мы будем работать со структурой sockaddr_storage.

Цикл сервера

14-22 Функция accept ждет соединения с клиентом. Мы выводим адрес клиента, вызывая функцию sock_ntop. В случае IPv4 или IPv6 эта функция выводит IP-адрес и номер порта. Мы могли бы использовать функцию getnameinfo (описанную в разделе 11.17), чтобы попытаться получить имя узла клиента, но это подразумевает запрос PTR в DNS, что может занять некоторое время, особенно если запрос PTR окажется неудачным. В разделе 14.8 [112] упоминается, что на занятом веб-сервере почти у 25% всех клиентов, соединяющихся с этим сервером, в DNS нет записей типа PTR. Поскольку мы не хотим, чтобы наш сервер (особенно последовательный сервер) в течение нескольких секунд ждал запрос PTR, мы просто выводим IP-адрес и порт.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Настройка даты и времени

Из книги Работа на ноутбуке автора Садовский Алексей

Настройка даты и времени Переходим к настройке даты и времени. Пожалуй, эта операция одна из самых простых среди изменений параметров работы Windows. Произвести ее можно, выбрав значок Дата и время из подраздела Дата, время, язык и региональные настройки на Панели управления.


Настройка даты и времени

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Настройка даты и времени Для настройки даты и времени щелкните правой кнопкой мыши на значке часов в области уведомлений и выберите пункт Настройка даты/времени. Чтобы изменить показания часов или текущую дату, вам понадобятся полномочия администратора компьютера.


7.10. Контроль даты и времени

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

7.10. Контроль даты и времени В разделе 7.5 было показано, что стандартные функции не проверяют корректность даты, а «переносят» ее вперед, если необходимо. Например, 31 ноября становится 1 декабря.Иногда такое поведение даже желательно. А если нет, то спешу обрадовать:


Функции даты и времени

Из книги Справочник по PHP автора

Функции даты и времени checkdateПроверяет правильность даты/времени.Синтаксис:int checkdate(int month, int day, int year);Функция checkdate() проверяет правильность даты, заданной в ее аргументах.Возвращает true если дата, указанная как "month, day, year" (месяц, число, год), правильна, иначе false. Дата считается


18.1. Вывод времени и даты

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

18.1. Вывод времени и даты 18.1.1. Представление времени В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC[148]. Положительные значения времени относятся к периоду после начала эпохи;


3.4. Функции даты и времени

Из книги MySQL 5.0. Библиотека программиста автора Гольцман Виктор Иосифович

3.4. Функции даты и времени В данном разделе мы рассмотрим некоторые полезные функции, выполняющие различные операции с датами: получение текущей даты и/или времени, получение отдельных компонентов даты и/или времени, арифметические операции с датами (сложение, вычитание)


ГЛАВА 10. Типы даты и времени.

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

ГЛАВА 10. Типы даты и времени. Firebird поддерживает в диалекте 3 типы данных DATE, TIME и TIMESTAMP. В диалекте 1 поддерживается только один тип данных, подобный TIMESTAMP, который, хотя и называется DATE, не является взаимозаменяемым с типом DATE диалекта 3. DATE В диалекте 3 DATE хранит одну дату без


6.1.3. Форматирование даты и времени

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

6.1.3. Форматирование даты и времени Примеры в предыдущем разделе показали, как поля в struct tm могли бы быть использованы в качестве индексов символьных строк для вывода информативных значений даты и времени. Хотя можно было бы написать собственный код, использующий такие


1.5. Простой сервер времени и даты

Из книги автора

1.5. Простой сервер времени и даты Мы можем написать простую версию сервера TCP для определения времени и даты, который будет работать с клиентом, описанным в разделе 1.2. Мы используем функции-обертки, описанные в предыдущем разделе. Код сервера приведен в листинге 1.5.Листинг


Пример: клиент времени и даты

Из книги автора

Пример: клиент времени и даты В листинге 11.5 показан наш клиент времени и даты из листинга 1.1, переписанный с использованием функции tcp_connect.Листинг 11.5. Клиент времени и даты, переписанный с использованием функции tcp_connect//names/daytimetcpcli.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5  int


Пример: сервер времени и даты с указанием протокола

Из книги автора

Пример: сервер времени и даты с указанием протокола В листинге 11.7 есть небольшая проблема: первый аргумент функции tcp_listen — пустой указатель, объединенный с семейством адресов AF_UNSPEC, который задает функция tcp_listen, — может заставить функцию getaddrinfo возвратить структуру


Пример: не зависящий от протокола UDP-клиент времени и даты

Из книги автора

Пример: не зависящий от протокола UDP-клиент времени и даты Теперь мы перепишем наш клиент времени и даты, показанный в листинге 11.3, так, чтобы в нем использовалась наша функция udp_client. В листинге 11.10 представлен не зависящий от протокола исходный код.Листинг 11.10. UDP-клиент


Пример: не зависящий от протокола UDP-сервер времени и даты

Из книги автора

Пример: не зависящий от протокола UDP-сервер времени и даты В листинге 11.13 представлен наш сервер времени и даты, полученный путем модификации листинга 11.8 и предназначенный для использования UDP.Листинг 11.13. Не зависящий от протокола UDP-сервер времени и даты//names/daytimeudpsrv2.c 1


Пример: сервер времени и даты в качестве демона

Из книги автора

Пример: сервер времени и даты в качестве демона В листинге 13.2 представлено изменение нашего сервера времени и даты, не зависящего от протокола. В отличие от сервера, показанного в листинге 11.8, в нем вызывается функция daemon_init, чтобы этот сервер мог выполняться в качестве