accept()

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

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
int accept( int s,
struct sockaddr *addr,
socklen_t *addrlen );

Аргументы:

s
Сокет, созданный с помощью socket().
addr
Результирующий параметр, который заполняется адресом подключающегося объекта, известным на уровне подключения. Точный формат параметра addr определяется доменом, в котором было установлено соединение.
addrlen
Параметр значение-результат. Первоначально он должен содержать размер области памяти, на котороую указывает addr; при возврате он содержит фактическую длину (в байтах) возвращенного адреса. Этот вызов используется с типами сокетов на основе соединения, в настоящее время с SOCK_STREAM.

Библиотека:

libsocket

Описание:

Функция accept():

Если в очереди нет ожидающих соединений и сокет не помечен как неблокирующий, accept() блокирует вызывающего клиента до тех пор, пока не будет установлено соединение. Если сокет помечен как неблокирующий и в очереди нет ожидающих подключений, accept() возвращает ошибку, как описано ниже. Принимающий сокет нельзя использовать для приема дополнительных подключений. Исходный сокет s остается открытым.

При выполнении select() для чтения из неподключенного сокета (на который был выполнен listen()), select() сообщает, когда возник запрос на соединение. Таким образом, возможно выполнить accept(), который не будет блокироваться. Для получения дополнительной информации см. select().

Для некоторых протоколов, требующих явного подтверждения, accept() может рассматриваться как простое исключение из очереди следующего запроса на соединение, а не как подтверждение. Подтверждение может являться обычным чтением или записью в новый дескриптор файла, а отклонение может подразумеваться путем закрытия нового сокета.

Возможно получение данных запроса на подключение пользователя без подтверждения подключения:

Точно так же возможно предоставить информацию об отклонении подключения пользователя, выполнив sendmsg() только с контрольной информацией, либо вызвав setsockopt().

Возвращаемое значение:

Дескриптор сокета, установевшего соединение. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EAGAIN
Недостаточно ресурсов для создания нового сокета.
EBADF
Некорректный дескриптор s.
EFAULT
Параметр addr располагается вне разрешенной для записи части пользовательского адресного пространства.
EINVAL
Функция accept() была вызвана для сокета, для которого не была вызвана фукнция listen().
EOPNOTSUPP
Требуемый сокет не является сокетом SOCK_STREAM.
ESRCH
Не удалось найти менеджер сокета.
EWOULDBLOCK
Сокет помечен как неблокирующий, отсутствуют подключения для приема.

Классификация:

POSIX 1003.1

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

bind(), close(), connect(), listen(), select(), socket()




Предыдущий раздел: Описание API сетевой библиотеки