connect(2)

ИМЯ
connect - инициирует соединение на сокете

LIBRARY
Standard C library (libc, -lc)

СИНТАКСИС
#include <sys/socket.h>

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

ОПИСАНИЕ
Системный вызов connect() устанавливает соединение с сокетом, заданным файловый дескриптором sockfd, ссылающимся на адрес addr. Аргумент addrlen определяет размер addr. Формат адреса в addr определяется адресным пространством сокета sockfd; подробнее можно узнать в socket(2).

Если сокет sockfd имеет тип SOCK_DGRAM, то адрес addr является адресом по умолчанию, куда посылаются датаграммы, и единственным адресом, откуда они принимаются. Если сокет имеет тип SOCK_STREAM или SOCK_SEQPACKET, то данный системный вызов попытается установить соединение с другим сокетом, заданным параметром addr.

Some protocol sockets (e.g., UNIX domain stream sockets) may successfully connect() only once.

Some protocol sockets (e.g., datagram sockets in the UNIX and Internet domains) may use connect() multiple times to change their association.

Some protocol sockets (e.g., TCP sockets as well as datagram sockets in the UNIX and Internet domains) may dissolve the association by connecting to an address with the sa_family member of sockaddr set to AF_UNSPEC; thereafter, the socket can be connected to another address. (AF_UNSPEC is supported since Linux 2.2.)

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set to indicate the error.

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

EACCES
    Для доменных сокетов UNIX, которые идентифицируются по имени пути: нет прав на запись в файл сокета, или в одном из каталогов пути запрещён поиск. (См. также path_resolution(7).)

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

EACCES
    It can also be returned if an SELinux policy denied a connection (for example, if there is a policy saying that an HTTP proxy can only connect to ports associated with HTTP servers, and the proxy tries to connect to a different port).

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

EADDRNOTAVAIL
    (доменные сокеты Интернета) Сокет, указанный sockfd, ранее не был привязан к адресу и при попытке привязать его к эфемеридному порту, было определено, что все номера в диапазоне эфемеридных портов уже используются. Смотрите обсуждение /proc/sys/net/ipv4/ip_local_port_range в ip(7).

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

EAGAIN
    Для неблокирующих доменных сокетов UNIX сокет не блокируется и соединение не может быть выполнено немедленно. Для других семейств сокетов в кэше маршрутизации недостаточно элементов.

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

EBADF
    Значение sockfd не является правильным открытым файловым дескриптором.

ECONNREFUSED
    Вызов connect() не нашёл слушающий удалённый адрес для потокового сокета.

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

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

EINTR
    Системный вызов был прерван пойманным сигналом; см. signal(7).

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

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

ENOTSOCK
    Файловый дескриптор sockfd указывает не на каталог.

EPROTOTYPE
    Тип сокета не поддерживается запрошенным протоколом связи. Это ошибка может возникать при попытке подключить доменный датаграммный сокет UNIX к потоковому сокету.

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

СТАНДАРТЫ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD, (connect() впервые появился 4.2BSD).

ЗАМЕЧАНИЯ
Описание типа socklen_t смотрите в accept(2).

Если вызов connect() завершается с ошибкой, то состояние сокета считается неопределённым. Переносимые приложения должны закрывать сокет и для переподключения создавать новый.

ПРИМЕРЫ
Пример использования connect() показан в getaddrinfo(3).

СМ. ТАКЖЕ
accept(2), bind(2), getsockname(2), listen(2), socket(2), path_resolution(7), selinux(8)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.