connect()

Инициализировать соединение на сокете

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
int connect( int s,
const struct sockaddr *name,
socklen_t namelen );

Аргументы:

s
Дескриптор сокета, к которому следует инициализировать соединение.
name
Имя сокета, к которому нужно подключиться для соединения SOCK_STREAM.
namelen
Длина name в байтах.

Библиотека:

libsocket

Описание:

Функция connect() устанавливает соединение в соответствии с типом сокета, указанным в s:

SOCK_DGRAM
Задает одноранговый узел, с которым должен быть связан сокет. Это тот адрес, на который должны отправляться датаграммы, и единственный, с которого должны приниматься датаграммы.
SOCK_STREAM
Этот вызов пытается установить соединение с другим сокетом. Другой сокет определяется именем name, которое является адресом в коммуникационном пространстве этого сокета. Каждое коммуникационное пространство интерпретирует name по-своему.

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

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EADDRINUSE
Адрес уже используется.
EADDRNOTAVAIL
Указанный адрес недоступен на этом компьютере.
EAFNOSUPPORT
Адреса в указанном семействе адресов не могут использоваться с этим сокетом.
EALREADY
Сокет неблокируемый; предыдущая попытка подключения еще не завершена.
EBADF
Некорректный дескриптор s.
ECONNABORTED
Функция connect() было завершена программно.
ECONNREFUSED
Попытка подключения была принудительно отклонена.
EFAULT
Параметр name указывает на область за пределами адресного пространства процесса.
EHOSTUNREACH
Нет маршрута к хосту; хост-система недоступна.
EINPROGRESS
Сокет неблокируемый; соединение не может быть выполнено немедленно. Можно выполнить select() для завершения, выбрав сокет для записи.
EISCONN
Сокет уже подключен.
ENETUNREACH
Сеть недоступна с данного хоста.
ETIMEDOUT
Истекло время попытки установить соединение; соединение не было установлено.


Note: Такие протоколы, как TCP, не позволяют производить дальнейшие запросы на подключение к сокету после ошибки ECONNREFUSED. В такой ситуации сокет необходимо закрыть и создать новый до того, как будет предпринята следующая попытка подключения.

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

ICMP, IP, TCP, и UDP протоколы

accept(), bind(), getsockname(), nbaconnect(), select(), socket()




Предыдущий раздел: Описание API сетевой библиотеки