connect -
инициирует
соединение
на сокете
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 <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
Katrin Kutepova <
[email protected]>, Yuri Kozlov
<
[email protected]> и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]