Инициализировать соединение на сокете
#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
- Истекло время попытки установить соединение; соединение не было установлено.
| Такие протоколы, как TCP, не позволяют производить дальнейшие запросы на подключение к сокету после ошибки ECONNREFUSED . В такой ситуации сокет необходимо закрыть и создать новый до того, как будет предпринята следующая попытка подключения. |
POSIX 1003.1
- Да
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
ICMP, IP, TCP, и UDP протоколы
accept(), bind(), getsockname(), nbaconnect(), select(), socket()
Предыдущий раздел: Описание API сетевой библиотеки