ИМЯ
connect -
    инициирует
    соединение
    на сокете
ОБЗОР
#include <sys/types.h>          /* Смотрите ЗАМЕЧАНИЯ */
#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.
Обычно
    сокеты с
    протоколами,
    основанными
    на
    соединении,
    могут
    устанавливать
    соединение
    connect() только
    один раз;
    сокеты с
    протоколами
    без
    установления
    соединения
    могут
    использовать
    connect()
    многократно,
    чтобы
    изменить
    адрес
    назначения.
    Сокеты без
    установления
    соединения
    могут
    прекратить
    связь с
    другим
    сокетом,
    установив
    член sa_family
    структуры
    sockaddr в AF_UNSPEC (в Linux
    поддерживается,
    начиная с
    ядра
    версии 2.2).
ВОЗВРАЩАЕМОЕ
  ЗНАЧЕНИЕ
Если
    соединение
    или
    привязка
    прошла
    успешно,
    возвращается
    ноль. При
    ошибке
    возвращается
    -1, а errno
    устанавливается
    должным
    образом.
ОШИБКИ
Ниже
    приведены
    только
    общие
    ошибки
    сокетов.
    Могут
    также
    появляться
    коды
    ошибок,
    существующие
    в
    конкретном
    домене.
  - EACCES
- Для
      доменных
      сокетов UNIX,
      которые
      идентифицируются
      по имени
      пути: нет
      прав на
      запись в
      файл
      сокета, или
      в одном из
      каталогов
      пути
      запрещён
      поиск. (См.
      также path_resolution(7).)
- EACCES,
    EPERM
- Пользователь
      попытался
      соединиться
      с
      широковещательным
      адресом, не
      установив
      широковещательный
      флаг на
      сокете или
      же запрос
      на
      соединение
      завершился
      неудачно
      из-за
      правила
      локального
      межсетевого
      экрана.
- 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).
ЗАМЕЧАНИЯ
В POSIX.1 не
    требуется
    включение
    <sys/types.h>, и этот
    заголовочный
    файл не
    требуется
    в Linux. Однако,
    для
    некоторых
    старых
    реализаций
    (BSD) требует
    данный
    файл, и в
    переносимых
    приложениях
    для
    предосторожности,
    вероятно,
    лучше его
    указать.
Описание
    типа socklen_t
    смотрите в
    accept(2).
Если
    вызов connect()
    завершается
    с ошибкой,
    то
    состояние
    сокета
    считается
    неопределённым.
    Переносимые
    приложения
    должны
    закрывать
    сокет и для
    переподключения
    создавать
    новый.