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
Пользователь попытался соединиться с широковещательным адресом, не
установив широковещательный флаг на сокете или же запрос на соединение
завершился неуспешно из-за локального правила на файерволле.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, 4.4BSD (функция
connect
впервые появилась в BSD 4.2). SVr4 документирует дополнительные общие
коды ошибок
EADDRNOTAVAIL,
EINVAL,
EAFNOSUPPORT,
EALREADY,
EINTR,
EPROTOTYPE,
и
ENOSR.
Там также документируется множество дополнительных кодов ошибок, не
описанных здесь.
ЗАМЕЧАНИЕ
Третий аргумент
connect
в действительности имеет тип
int
(а в BSD 4.*, libc4 и libc5 это так и есть). Определенное
недопонимание привело к появлению
socklen_t.
Черновик стандарта еще не принят, но glibc2 уже следует ему и в ней
присутствует
socklen_t.
Смотри также
accept(2).
ОШИБКИ
Прекращение соединения на сокете с помощью вызова
connect
с адресом
AF_UNSPEC
еще не реализовано.