Системный вызов connect linux

Системный вызов connect linux

#include /* Смотрите ЗАМЕЧАНИЯ */
#include
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. Обычно сокеты с протоколами, основанными на соединении, могут устанавливать соединение connect() только один раз; сокеты с протоколами без установления соединения могут использовать connect() многократно, чтобы изменить адрес назначения. Сокеты без установления соединения могут прекратить связь с другим сокетом, установив член sa_family структуры sockaddr в AF_UNSPEC (в Linux поддерживается, начиная с ядра версии 2.2).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Если соединение или привязка прошла успешно, возвращается ноль. При ошибке возвращается -1, а errno устанавливается должным образом.

ОШИБКИ

Ниже приведены только общие ошибки сокетов. Могут также появляться коды ошибок, существующие в конкретном домене. EACCES Для доменных сокетов UNIX, которые идентифицируются по имени пути: нет прав на запись в файл сокета, или в одном из каталогов пути запрещён поиск. (См. также path_resolution(7).) EACCES, EPERM Пользователь попытался соединиться с широковещательным адресом, не установив широковещательный флаг на сокете или же запрос на соединение завершился неудачно из-за правила локального межсетевого экрана. EADDRINUSE Локальный адрес уже используется. EADDRNOTAVAIL (доменные сокеты Интернета) Сокет, указанный sockfd, ранее не был привязан к адресу и при попытке привязать его к эфемеридному порту, было определено, что все номера в диапазоне эфемеридных портов уже используются. Смотрите обсуждение /proc/sys/net/ipv4/ip_local_port_range в ip(7). EAFNOSUPPORT Адрес имеет некорректное семейство адресов в поле sa_family. EAGAIN Недостаточно элементов в кэше маршрутизации. EALREADY Сокет является неблокирующим, а предыдущая попытка установить соединение ещё не завершилась. EBADF Значение sockfd не является правильным открытым файловым дескриптором. ECONNREFUSED Ничто не слушает удалённый адрес. EFAULT Адрес структуры сокета находится за пределами пользовательского адресного пространства. EINPROGRESS Сокет является неблокирующим, а соединение не может быть установлено немедленно. Можно использовать 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.

Читайте также:  Линия observer 32 linux

СООТВЕТСТВИЕ СТАНДАРТАМ

ЗАМЕЧАНИЯ

В POSIX.1 не требуется включение , и этот заголовочный файл не требуется в Linux. Однако, для некоторых старых реализаций (BSD) требует данный файл, и в переносимых приложениях для предосторожности, вероятно, лучше его указать. Третий аргумент connect() в действительности имеет тип int (а в 4.x BSD, libc4 и libc5 это так и есть). Некоторый беспорядок POSIX сказавшийся на настоящей socklen_t, также используется в glibc. См. также accept(2). Если вызов connect() завершается с ошибкой, то состояние сокета считается неопределённым. Переносимые приложения должны закрывать сокет и для переподключения создавать новый.

Источник

Системный вызов connect linux

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 Пользователь попытался соединиться с широковещательным адресом, не установив широковещательный флаг на сокете или же запрос на соединение завершился неуспешно из-за локального правила на файерволле.

Читайте также:  Hp laserjet pro mfp m428fdn driver linux

СООТВЕТСТВИЕ СТАНДАРТАМ

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 linux

The connect () system call connects the socket referred to by the file descriptor sockfd to the address specified by serv_addr . The addrlen argument specifies the size of serv_addr . The format of the address in serv_addr is determined by the address space of the socket sockfd ; see socket (2) for further details.

If the socket sockfd is of type SOCK_DGRAM then serv_addr is the address to which datagrams are sent by default, and the only address from which datagrams are received. If the socket is of type SOCK_STREAM or SOCK_SEQPACKET , this call attempts to make a connection to the socket that is bound to the address specified by serv_addr .

Generally, connection-based protocol sockets may successfully connect () only once; connectionless protocol sockets may use connect () multiple times to change their association. Connectionless sockets may dissolve the association by connecting to an address with the sa_family member of sockaddr set to AF_UNSPEC (supported on Linux since kernel 2.2).

RETURN VALUE

If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.

Читайте также:  Change right directory linux

ERRORS

The following are general socket errors only. There may be other domain-specific error codes. EACCES For Unix domain sockets, which are identified by pathname: Write permission is denied on the socket file, or search permission is denied for one of the directories in the path prefix. (See also path_resolution (7).) EACCES , EPERM The user tried to connect to a broadcast address without having the socket broadcast flag enabled or the connection request failed because of a local firewall rule. EADDRINUSE Local address is already in use. EAFNOSUPPORT The passed address didn’t have the correct address family in its sa_family field. EAGAIN No more free local ports or insufficient entries in the routing cache. For AF_INET see the description of /proc/sys/net/ipv4/ip_local_port_range ip (7) for information on how to increase the number of local ports. EALREADY The socket is non-blocking and a previous connection attempt has not yet been completed. EBADF The file descriptor is not a valid index in the descriptor table. ECONNREFUSED No-one listening on the remote address. EFAULT The socket structure address is outside the user’s address space. EINPROGRESS The socket is non-blocking and the connection cannot be completed immediately. It is possible to select (2) or poll (2) for completion by selecting the socket for writing. After select (2) indicates writability, use getsockopt (2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect () completed successfully ( SO_ERROR is zero) or unsuccessfully ( SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure). EINTR The system call was interrupted by a signal that was caught; see signal (7). EISCONN The socket is already connected. ENETUNREACH Network is unreachable. ENOTSOCK The file descriptor is not associated with a socket. ETIMEDOUT Timeout while attempting connection. The server may be too busy to accept new connections. Note that for IP sockets the timeout may be very long when syncookies are enabled on the server.

CONFORMING TO


NOTES

POSIX.1-2001 does not require the inclusion of , and this header file is not required on Linux. However, some historical (BSD) implementations required this header file, and portable applications are probably wise to include it.

The third argument of connect () is in reality an int (and this is what 4.x BSD and libc4 and libc5 have). Some POSIX confusion resulted in the present socklen_t , also used by glibc. See also accept (2).

Источник

Оцените статью
Adblock
detector