Книга: Основы программирования в Linux
Прием запросов на соединение
Прием запросов на соединение
После создания и именования сокета серверная программа может ждать запросы на выполнение соединения с сокетом с помощью системного вызова accept
:
#include <sys/socket.h>
int accept(int socket, struct sockaddr *address, size_t *address_len);
Системный вызов accept
возвращает управление, когда клиентская программа пытается подключиться к сокету, заданному в параметре socket
. Этот клиент — первый из ждущих соединения в очереди данного сокета. Функция accept
создает новый сокет для обмена данными с клиентом и возвращает его дескриптор. У нового сокета будет тот же тип, что и у сокета сервера, ждущего запросы на соединения.
Предварительно сокету должно быть присвоено имя с помощью системного вызова bind
и у него должна быть очередь запросов на соединение, место для которой выделил системный вызов listen
. Адрес вызывающего клиента будет помещен в структуру sockaddr
, на которую указывает параметр address
. Если адрес клиента не представляет интереса, в этом параметре может задать пустой указатель.
Параметр address_len
задает длину адресной структуры клиента. Если адрес клиента длиннее, чем это значение, он будет урезан. Перед вызовом accept
в параметре address_len
должна быть задана ожидаемая длина адреса. По возвращении из вызова в address_len
будет установлена реальная длина адресной структуры запрашивающего соединение клиента.
Если нет запросов на соединение, ждущих в очереди сокета, вызов accept будет заблокирован (так что программа не сможет продолжить выполнение) до тех пор, пока клиент не сделает запрос на соединение. Вы можете изменить это поведение, применив флаг O_NONBLOCK
в файловом дескрипторе сокета с помощью вызова fcntl
в вашей программе следующим образом:
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, O_NONBLOCK | flags);
Функция accept
возвращает файловый дескриптор нового сокета, если есть запрос клиента, ожидающего соединения, и -1 в случае ошибки. Возможные значения ошибок такие же, как у вызовов bind
и listen
плюс дополнительная константа EWOULDBLOCK
в случае, когда задан флаг O_NONBLOCK
и нет ждущих запросов на соединение. Ошибка EINTR
возникнет, если процесс прерван во время блокировки в функции accept
.
- Восстановление из резервной копии на системе-приемнике
- Улучшенный оптимизатор запросов
- Асинхронный сервер и отмена выполняющихся запросов
- Прием «кулисы»
- Прием 45. «Простые слова. Четкие идеи. Сильные эмоции»
- 1. Оператор Select – базовый оператор языка структурированных запросов
- 2. Унарные операции на языке структурированных запросов
- 3. Бинарные операции на языке структурированных запросов
- 4. Использование подзапросов
- Прием 49. «Сопереживание и искренность»
- Обработка запросов с помощью PHP
- 5.2. Основные приемы работы, элементы текстового редактора