НАЗВАНИЕ¶
connect - инициирует
соединение
на сокете
ОБЗОР¶
#include <sys/types.h>
#include <sys/socket.h>
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
еще не
реализовано.
СМОТРИ
ТАКЖЕ¶
accept(2),
bind(2),
listen(2),
socket(2),
getsockname(2)
ПЕРЕВОД¶
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999