Scroll to navigation

CONNECT(2) Podręcznik programisty Linuksa CONNECT(2)

NAZWA

connect - inicjalizacja połączenia poprzez gniazdo

SKŁADNIA

#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

OPIS

Deskryptor sockfd musi odnosić się do gniazda. Jeśli gniazdo jest typu SOCK_DGRAM, to adres serv_addr jest adresem, do którego domyślnie przesyłane są datagramy i jedynym adresem, z którego datagramy są odbierane. Jeśli gniazdo jest typu SOCK_STREAM lub SOCK_SEQPACKET, to ta funkcja próbuje nawiązać połączenie z innym gniazdem. Inne gniazdo jest podane jako serv_addr, co jest adresem (o długości addrlen) w przestrzeni komunikacyjnej gniazda. Każda z przestrzeni komunikacyjnych interpretuje serv_addr, po swojemu.

Ogólnie, gniazda strumieniowe (dla protokołów połączeniowych) mogą pomyślnie wykonać connect tylko raz; gniazda datagramowe (dla protokołów bezpołączeniowych) mogą używać connect wielokrotnie do zmiany swojego przypisania. Gniazda datagramowe mogą zniszczyć powiązanie przez łączenie się z adresem, w którym pole sa_family struktury sockaddr ma wartość AF_UNSPEC.

WARTOŚĆ ZWRACANA

Jeśli połączenie lub przywiązanie uda się, zwracane jest zero. Przy błędzie, zwracane jest -1 i odpowiednio ustawiane errno.

BŁĘDY

Następujące błędy to jedynie ogólne błędy gniazd. Mogą występować również inne, specyficzne dla domeny kody błędów.

Deskryptor nie jest prawidłowym indeksem tablicy deskryptorów.
Adres struktura gniazda znajduje się poza przestrzenią adresową użytkownika.
Deskryptor nie jest związany z gniazdem.
Gniazdo już jest połączone.
Żaden serwer nie nasłuchuje na zdalnym adresie.
Przeterminowanie próby połączenia. Serwer może być zbyt zajęty, aby przyjmować nowe połączenia. Dla gniazd IP czas przeterminowania może być bardzo długi, gdy na serwerze włączone są "syncookies".
Sieć jest nieosiągalna.
Adres lokalny już jest wykorzystywany.
Gniazdo jest nieblokujące, a połączenie nie może zostać zrealizowane natychmiast. Jest możliwe wykonanie select(2) lub poll(2) w celu dokończenia poprzez wybranie gniazda do zapisu. Po tym, jak select wskaże zapisywalność, należy użyć getsockopt(2), aby odczytać opcję SO_ERROR z poziomu SOL_SOCKET w celu określenia, czy connect zakończyło się pomyślnie (SO_ERROR będzie zerem) lub niepomyślnie (SO_ERROR będzie jednym ze typowych, wymienionych powyżej kodów błędów, wyjaśniających przyczynę błędu).
Gniazdo jest nieblokujące, a poprzednia próba połączenia nie została zakończona. EAGAIN Brak wolnych portów lokalnych, lub brak wpisów w buforze marszrutowym. Dla PF_INET w opisie sysctl net.ipv4.ip_local_port_range w ip(7) opisano, jak zwiększyć liczbę portów lokalnych.
Przekazany adres miał prawidłowej rodziny adresów w swoim polu sa_family.
Użytkownik próbował podłączyć się do adresu rozgłoszeniowego (broadcast) bez włączonego znacznika "broadcast" dla gniazda lub też połączenie nie udało się z powodu lokalnej reguły firewalla.

ZGODNE Z

SVr4, 4.4BSD (funkcja connect pojawiła się pierwotnie w BSD 4.2). SVr4 dokumentuje dodatkowe błędy ogólne EADDRNOTAVAIL, EINVAL, EAFNOSUPPORT, EALREADY, EINTR, EPROTOTYPE i ENOSR. Dokumentuje także wiele dodatkowych błędów tutaj nieopisanych.

UWAGA

Trzeci argument connect jest w rzeczywistości typu int (i tak jest w BSD 4.*, libc4 i libc5). Pewne zamieszanie w POSIX doprowadziło jego zmiany na obecny socklen_t. Szkic standardu nie został jeszcze przyjęty, ale glibc2 już jest z nim zgodne i zawiera również socklen_t. Zobacz także accept(2).

USTERKI

Rozłączanie gniazda poprzez wywołanie connect z adresem AF_UNSPEC nie jest jeszcze wspierane.

ZOBACZ TAKŻE

accept(2), bind(2), listen(2), socket(2), getsockname(2)

1998-10-03 Linux 2.2