Сервер времени и даты был рассмотрен нами достаточно кратко, как и клиент из предыдущего раздела. Запомните следующие моменты.
■ Сервер, как и клиент, зависим от протокола IPv4. В листинге 11.7 мы покажем версию, не зависящую от протокола, которая использует функцию >getaddrinfo
.
■ Наш сервер обрабатывает только один запрос клиента за один раз. Если приблизительно в одно время происходит множество клиентских соединений, ядро ставит их в очередь, максимальная длина которой регламентирована, и передает эти соединения функции accept по одному за один раз. Наш сервер времени и даты, который требует вызова двух библиотечных функций, time и ctime, является достаточно быстрым. Но если у сервера обслуживание каждого клиента занимает больше времени (допустим, несколько секунд или минуту), нам будет необходимо некоторым образом организовать одновременное обслуживание нескольких клиентов.
Сервер, показанный в листинге 1.5, называется последовательным сервером (iterative server), поскольку он обслуживает клиентов последовательно, по одному клиенту за один раз. Существует несколько технологий написания параллельного сервера (concurrent server), который обслуживает множество клиентов одновременно. Самой простой технологией является вызов функции Unix >fork
(раздел 4.7), когда создается по одному дочернему процессу для каждого клиента. Другой способ — использование программных потоков (threads) вместо функции >fork
(раздел 26.4) или предварительное порождение фиксированного количества дочерних процессов с помощью функции fork в начале работы (раздел 30.6).
■ Запуская такой сервер из командной строки, мы обычно рассчитываем, что он будет работать достаточно долго, поскольку часто серверы работают, пока работает система. Поэтому мы должны модифицировать код сервера таким образом, чтобы он корректно работал как демон (daemon) Unix, то есть процесс, функционирующий в фоновом режиме без подключения к терминалу. Это решение подробно описано в разделе 13.4.
1.6. Таблица соответствия примеров технологии клиент-сервер
Технологии сетевого программирования иллюстрируются в этой книге на двух основных примерах:
■ клиент-сервер времени и даты (описание которого мы начали в листингах 1.1, 1.2 и 1.5), и
■ эхо-клиент-сервер (который появится в главе 5).
Чтобы обеспечить удобный поиск различных тем, которых мы касаемся в этой книге, мы объединили разработанные нами программы и сопроводили их номерами листингов, в которых приведен исходный код. В табл. 1.1 перечислены версии клиента времени и даты (две из них мы уже видели). В табл. 1.2 перечисляются версии сервера времени и даты. В табл. 1.3 представлены версии эхо-клиента, а в табл. 1.4 — версии эхо-сервера.
Таблица 1.1. Различные версии клиента времени и даты
Листинг | Описание |
---|
1.1 | TCP/Ipv4, зависимый от протокола |
1.2 | TCP/Ipv6, зависимый от протокола |
11.2 | TCP/Ipv4, зависимый от протокола, вызывает функции gethostbyname и getservbyname |
11.5 | TCP, независимый от протокола, вызывает функции getaddrinfo и tcp_connect |
11.10 | UDP, независимый от протокола, вызывает функции getaddrinfo и udp_connect |
16.7 | TCP, использует неблокирующую функцию connect |
31.2 | TCP/IPv4, зависимый от протокола |
Д.1 | TCP, зависимый от протокола, генерирует SIGPIPE |
Д.2 | TCP, зависимый от протокола, печатает размер буфера сокета и MSS |
Д.5 | TCP, зависимый от протокола, допускает использование имени узла (функция gethostbyname) или IP-адреса |
Д.6 | TCP, независимый от протокола, допускает использование имени узла (функция gethostbyname). |
Таблица 1.2. Различные версии сервера времени и даты, рассматриваемые в данной книге
Листинг | Описание |
---|
1.5 | TCP/IPv4, зависимый от протокола |
11.7 | TCP, независимый от протокола, вызывает getaddrinfo и tcp_listen |
11.8 | TCP, независимый от протокола, вызывает getaddrinfo и tcp_listen |
11.13 | UDP, независимый от протокола, вызывает getaddrinfo и udp_server |
13.2 | TCP, независимый от протокола, выполняется как автономный демон |
13.4 | TCP, независимый от протокола, порожденный демоном inetd |
Таблица 1.3. Различные версии эхо-клиента, рассматриваемые в данной книге
Листинг | Описание |
---|
5.3 | TCP/IPv4, зависимый от протокола |