Документация по LinuxLinuxDoc.Ru 🔍

connect - функция, устанавливающая соединение с сокетом

НАЗВАНИЕ
connect - функция, устанавливающая соединение с сокетом

СИНТАКСИС
#include
#include

int connect(int sockfd, const struct sockaddr *serv_addr,
socklen_t addrlen);

ОПИСАНИЕ
Файловый описатель sockfd должен указывать на какой-либо
сокет. Если сокет имеет тип SOCK_DGRAM, значит, адрес
serv_addr по умолчанию является тем адресом, на который
посылаются датаграммы, и единственным адресом, откуда они
принимаются. Если сокет имеет тип SOCK_STREAM или
SOCK_SEQPACKET, то этот вызов попытается установить
соединение с другим сокетом. Другой сокет задан
параметром serv_addr, являющийся адресом (длиной addrelen)
в пространстве соединений сокета. Каждое пространство
коммуникации по своему интерпретирует параметр serv_addr.

Обычно сокеты с протоколами, основанными на соединении,
могут устанавливать соединение только один раз; сокеты с
протоколами без соединения могут использовать connect
многократно, чтобы изменить адрес назначения. Сокеты без
поддержки соединения могут прекратить связь с другим
сокетом, установив компонент sa_family структуры sockaddr
в положение AF_UNSPEC.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если соединение или "привязка" прошли успешно,
возвращаемое значение равно нулю. При ошибке возвращаемое
значение равно -1, а в errno записывается код ошибки.

КОДЫ ОШИБОК
Ниже описаны только основные ошибки сокетов. Могут также
появляться коды ошибок, существующие в конкретном домене.

EBADF Файловый описатель имеет неверный индекс в таблице
описателей.

EFAULT Адрес структуры сокета находится за пределами
адресного пространства.

ENOTSOCK
Файловый описатель не связан с сокетом.

EISCONN
Соединение с сокетом уже произошло.

ECONNREFUSED
С другой стороны нет "слушающего" сокета.

ETIMEDOUT
Превышен период ожидания соединения. Сервер,
возможно, слишком занят и не может принимать новые
запросы. Заметьте, что для IP-сокетов время
ожидания может быть очень долгим, если на сервере
разрешено использование syncookies.

ENETUNREACH
Сеть недоступна.

EADDRINUSE
Локальный адрес уже используется.

EINPROGRESS
Сокет является неблокирующим, а соединение не может
быть установлено прямо сейчас. Можно использовать
select(2) или poll(2), чтобы закончить соединение,
выбрав соответствующий сокет. После того, как
select сообщит об этом, используйте getsockopt(2),
чтобы прочитать флаг SO_ERROR на уровне SOL_SOCKET.
Это необходимо для того, чтобы определить, была ли
завершена работа connect успешно (в этом случае,
SO_ERROR равен нулю). При этом значение SO_ERROR
равно одному из обычных кодов ошибок, перечисленных
здесь. Он объясняет причину неудачи.

EALREADY
Сокет является неблокирующим, а предыдущая попытка
установить соединение еще не завершилась.

EAGAIN Не осталось свободных локальных портов, или же
недостаточно места в кэше маршрутизации. Для
домена PF_INET смотри описание системной переменной
net.ipv4.ip_local_port_range в ip(7), где
объясняется, как увеличить количество локальных
портов.

EAFNOSUPPORT
Адрес находится в некорректном семействе адресов
поля sa_family.

EACCES, EPERM
Пользователь попытался соединиться с
широковещательным адресом, не установив
соответствующий флаг на сокете, или же запрос на
соединение завершился неудачно из-за локального
правила firewall.

СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, 4.4BSD (функция connect впервые появилась в BSD
4.2). SVr4 описывает дополнительные коды ошибок: EADDRNO-
TAVAIL, EINVAL, EAFNOSUPPORT, EALREADY, EINTR, EPROTOTYPE,
и ENOSR. Там также описывается множество дополнительных
кодов ошибок, не описанных в этом документе.

ЗАМЕЧАНИЕ
Третий аргумент connect в действительности имеет тип int
(это справедливо для BSD 4.*, libc4 и libc5).
Определенное недопонимание привело к появлению socklen_t.
Черновой вариант этого стандарта еще не принят, но в
glibc2 уже содержится socklen_t. См. также accept(2).

НАЙДЕННЫЕ ОШИБКИ
Еще не удалось разорвать соединения с сокетом, вызывая с
помощью функции connect адрес AF_UNSPEC.
Читать новости Linux в Telegram
Linux - connect - функция, устанавливающая соединение с сокетом
Мы в соцсетях ✉