connect(2)

NAZWA
connect - inicjuje połączenie poprzez gniazdo

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <sys/socket.h>

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

OPIS
Wywołanie systemowe connect() łączy gniazdo określone deskryptorem pliku sockfd z adresem podanym jako addr. Argument addrlen określa rozmiar addr. Format adresu addr zależy od przestrzeni adresowej gniazda sockfd; więcej szczegółów w podręczniku socket(2).

Jeśli gniazdo sockfd jest typu SOCK_DGRAM, to adres 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 to wywołanie próbuje nawiązać połączenie z gniazdem skojarzonym z adresem podanym w addr.

Gniazda niektórych protokołów (np. gniazda strumieniowe dziedziny Uniksa) mogą pomyślnie połączyć się za pomocą connect() tylko raz.

Gniazda niektórych protokołów (np. gniazda datagramowe w dziedzinach Uniksa i Internetu) mogą użyć connect() wielokrotnie, aby zmienić swoje przypisanie.

Gniazda niektórych protokołów (np. gniazda TCP oraz gniazda datagramowe w dziedzinach Uniksa i Internetu) mogą zniszczyć powiązanie przez łączenie się z adresem, w którym pole sa_family struktury sockaddr ma wartość AF_UNSPEC; następnie gniazdo można połączyć z innym adresem (AF_UNSPEC jest obsługiwane od Linuksa 2.2).

WARTOŚĆ ZWRACANA
Jeśli połączenie lub przywiązanie uda się, zwracane jest zero. Przy błędzie, zwracane jest -1 i ustawiane jest errno wskazując błąd.

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.

EACCES
    W przypadku gniazd domeny Uniksa identyfikowanych ścieżką: Odmówiono uprawnienia do zapisu pliku gniazda lub odmówiono uprawnienia wyszukania dla jednego z katalogów w ścieżce (zob. też path_resolution(7)).

EACCES
EPERM
    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 zapory sieciowej.

EACCES
    Błąd może być zwrócony również gdy reguły SELinux odmówiły połączenia (np. gdy istnieje reguła określająca, że pośrednik HTTP może połączyć się tylko z portem przypisanym serwerom HTTP, a pośrednik próbuje połączyć się z innym portem).

EADDRINUSE
    Adres lokalny już jest wykorzystywany.

EADDRNOTAVAIL
    (gniazda domeny Internet) Gniazdo określone w sockfd nie było wcześniej skojarzone z adresem i przy próbie skojarzenia z portem dynamicznym (efemerycznym), okazało się, że wszystkie numery portów w zakresie portów dynamicznych są aktualnie używane. Więcej informacji w opisie pliku /proc/sys/net/ipv4/ip_local_port_range w podręczniku ip(7).

EAFNOSUPPORT
    Przekazany adres nie miał prawidłowej rodziny adresów w swoim polu sa_family.

EAGAIN
    W przypadku nieblokujących gniazd domeny Uniksa: gniazdo jest nieblokujące, a połączenie nie może być natychmiast zestawione. W przypadku gniazd z innych rodzin: istnieje niewystarczająca liczba wpisów w buforze trasowania.

EALREADY
    Gniazdo jest nieblokujące, a poprzednia próba połączenia nie została zakończona.

EBADF
    sockfd nie jest prawidłowym indeksem tablicy deskryptorów.

ECONNREFUSED
    connect() w przypadku gniazda strumieniowego nie znalazło nikogo nasłuchującego na zdalnym adresie.

EFAULT
    Adres struktury gniazda znajduje się poza przestrzenią adresową użytkownika.

EINPROGRESS
    Gniazdo jest nieblokujące, a połączenie nie może zostać zrealizowane natychmiast (gniazda domeny Uniksa zwracają wówczas inny błąd: EAGAIN). Jest możliwe wykonanie select(2) lub poll(2) w celu dokończenia poprzez wybranie gniazda do zapisu. Po tym, jak select(2) 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).

EINTR
    Wywołanie systemowe zostało przerwane przechwyconym sygnałem; zob. signal(7).

EISCONN
    Gniazdo już jest połączone.

ENETUNREACH
    Sieć jest nieosiągalna.

ENOTSOCK
    Deskryptor pliku sockfd nie odnosi się do gniazda.

EPROTOTYPE
    Typ gniazda nie obsługuje żądanego protokołu komunikacji. Błąd ten może wystąpić np. przy próbie połączenia gniazda datagramowego domeny Uniksa z gniazdem strumieniowym.

ETIMEDOUT
    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”.

STANDARDY
POSIX.1-2008.

HISTORIA
POSIX.1-2001, SVr4, 4.4BSD (connect() pojawiło się pierwotnie w 4.2BSD).

UWAGI
Jeśli connect() zawiedzie, należy uznać stan gniazda za nieokreślony. Przenośne aplikacje powinny zamknąć gniazdo i utworzyć nowe w celu ponownego połączenia.

PRZYKŁADY
Przykładowe użycie connect() pokazano w getaddrinfo(3).

ZOBACZ TAKŻE
accept(2), bind(2), getsockname(2), listen(2), socket(2), path_resolution(7), selinux(8)

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.