Книга: Программирование для Linux. Профессиональный подход
5.5.3. Серверы
5.5.3. Серверы
Жизненный цикл сервера можно представить так:
1) создание сокета, ориентированного на соединения (функция socket());
2) назначение сокету адреса привязки (функция bind());
3) перевод сокета в режим ожидания запросов (функция listen());
4) прием поступающих запросов (функция accept());
5) закрытие сокета (функция close()).
Данные не записываются и не читаются напрямую через серверный сокет. Вместо этого всякий раз, когда сервер принимает запрос на соединение, ОС Linux создает отдельный сокет, используемый для передачи данных через это соединение.
Серверному сокету необходимо с помощью функции bind()
назначить адрес, чтобы клиент смог его найти. Первым аргументом функции является дескриптор сокета. Второй аргумент — это указатель на адресную структуру, формат которой будет зависеть от выбранного семейства адресов. Третий аргумент — это длина адресной структуры в байтах. После получения адреса сокет, ориентированный на соединения, должен вызвать функцию listen()
, тем самым обозначив себя как сервер. Первым аргументом этой функции также является дескриптор сокета. Второй аргумент определяет, сколько запросов может находиться в очереди ожидания. Если очередь заполнена, все последующие запросы отвергаются. Этот аргумент задает не предельное число запросов, которое способен обработать сервер. а максимальное количество клиентов, которые могут находиться в режиме ожидания.
Сервер принимает от клиента запрос на подключение, вызывая функцию accept()
. Первый ее аргумент — это дескриптор сокета. Второй аргумент указывает на адресную структуру, заполняемую адресом клиентского сокета. Третий аргумент содержит длину (в байтах) адресной структуры. Функция accept()
создает новый сокет для обслуживания клиентского соединения и возвращает его дескриптор. Исходный серверный сокет продолжает принимать запросы от клиентов. Чтобы прочитать данные из сокета, не удалив их из входящей очереди, воспользуйтесь функцией recv()
. Она принимает те же аргументы, что и функция read(), плюс дополнительный аргумент FLAGS
. Флаг MSG_PEEK
задает режим "неразрушающего" чтения, при котором прочитанные данные остаются в очереди.
- 11.3. Внешние DNS-серверы
- 1.3. Анонимные прокси-серверы: сокрытие IP-адреса и местонахождения
- Серверы-депозитарии
- 8.1. Суперсерверы inetd и xinetd
- Почтовые серверы открытых ключей PGP.
- Глава 15 Серверы шрифтов
- Глава 21 FTP-серверы
- Серверы NFS для системы Linux
- Серверы печати для Linux
- Временные серверы для Linux
- Серверы POP для Linux
- Серверы IMAP для Linux