connect(2) System Calls Manual connect(2) NAZWA connect - inicjuje polaczenie poprzez gniazdo BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); OPIS Wywolanie systemowe connect() laczy gniazdo okreslone deskryptorem pliku sockfd z adresem podanym jako addr. Argument addrlen okresla rozmiar addr. Format adresu addr zalezy od przestrzeni adresowej gniazda sockfd; wiecej szczegolow w podreczniku socket(2). Jesli gniazdo sockfd jest typu SOCK_DGRAM, to adres addr jest adresem, do ktorego domyslnie przesylane sa datagramy i jedynym adresem, z ktorego datagramy sa odbierane. Jesli gniazdo jest typu SOCK_STREAM lub SOCK_SEQPACKET, to to wywolanie probuje nawiazac polaczenie z gniazdem skojarzonym z adresem podanym w addr. Gniazda niektorych protokolow (np. gniazda strumieniowe dziedziny Uniksa) moga pomyslnie polaczyc sie za pomoca connect() tylko raz. Gniazda niektorych protokolow (np. gniazda datagramowe w dziedzinach Uniksa i Internetu) moga uzyc connect() wielokrotnie, aby zmienic swoje przypisanie. Gniazda niektorych protokolow (np. gniazda TCP oraz gniazda datagramowe w dziedzinach Uniksa i Internetu) moga zniszczyc powiazanie przez laczenie sie z adresem, w ktorym pole sa_family struktury sockaddr ma wartosc AF_UNSPEC; nastepnie gniazdo mozna polaczyc z innym adresem (AF_UNSPEC jest obslugiwane od Linuksa 2.2). WARTOSC ZWRACANA Jesli polaczenie lub przywiazanie uda sie, zwracane jest zero. Przy bledzie, zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY Nastepujace bledy to jedynie ogolne bledy gniazd. Moga wystepowac rowniez inne, specyficzne dla domeny kody bledow. EACCES W przypadku gniazd domeny Uniksa identyfikowanych sciezka: Odmowiono uprawnienia do zapisu pliku gniazda lub odmowiono uprawnienia wyszukania dla jednego z katalogow w sciezce (zob. tez path_resolution(7)). EACCES EPERM Uzytkownik probowal podlaczyc sie do adresu rozgloszeniowego (broadcast) bez wlaczonego znacznika ,,broadcast" dla gniazda lub tez polaczenie nie udalo sie z powodu lokalnej reguly zapory sieciowej. EACCES Blad moze byc zwrocony rowniez gdy reguly SELinux odmowily polaczenia (np. gdy istnieje regula okreslajaca, ze posrednik HTTP moze polaczyc sie tylko z portem przypisanym serwerom HTTP, a posrednik probuje polaczyc sie z innym portem). EADDRINUSE Adres lokalny juz jest wykorzystywany. EADDRNOTAVAIL (gniazda domeny Internet) Gniazdo okreslone w sockfd nie bylo wczesniej skojarzone z adresem i przy probie skojarzenia z portem dynamicznym (efemerycznym), okazalo sie, ze wszystkie numery portow w zakresie portow dynamicznych sa aktualnie uzywane. Wiecej informacji w opisie pliku /proc/sys/net/ipv4/ip_local_port_range w podreczniku ip(7). EAFNOSUPPORT Przekazany adres nie mial prawidlowej rodziny adresow w swoim polu sa_family. EAGAIN W przypadku nieblokujacych gniazd domeny Uniksa: gniazdo jest nieblokujace, a polaczenie nie moze byc natychmiast zestawione. W przypadku gniazd z innych rodzin: istnieje niewystarczajaca liczba wpisow w buforze trasowania. EALREADY Gniazdo jest nieblokujace, a poprzednia proba polaczenia nie zostala zakonczona. EBADF sockfd nie jest prawidlowym indeksem tablicy deskryptorow. ECONNREFUSED connect() w przypadku gniazda strumieniowego nie znalazlo nikogo nasluchujacego na zdalnym adresie. EFAULT Adres struktury gniazda znajduje sie poza przestrzenia adresowa uzytkownika. EINPROGRESS Gniazdo jest nieblokujace, a polaczenie nie moze zostac zrealizowane natychmiast (gniazda domeny Uniksa zwracaja wowczas inny blad: EAGAIN). Jest mozliwe wykonanie select(2) lub poll(2) w celu dokonczenia poprzez wybranie gniazda do zapisu. Po tym, jak select(2) wskaze zapisywalnosc, nalezy uzyc getsockopt(2), aby odczytac opcje SO_ERROR z poziomu SOL_SOCKET w celu okreslenia, czy connect() zakonczylo sie pomyslnie (SO_ERROR bedzie zerem) lub niepomyslnie (SO_ERROR bedzie jednym ze typowych, wymienionych powyzej kodow bledow, wyjasniajacych przyczyne bledu). EINTR Wywolanie systemowe zostalo przerwane przechwyconym sygnalem; zob. signal(7). EISCONN Gniazdo juz jest polaczone. ENETUNREACH Siec jest nieosiagalna. ENOTSOCK Deskryptor pliku sockfd nie odnosi sie do gniazda. EPROTOTYPE Typ gniazda nie obsluguje zadanego protokolu komunikacji. Blad ten moze wystapic np. przy probie polaczenia gniazda datagramowego domeny Uniksa z gniazdem strumieniowym. ETIMEDOUT Przeterminowanie proby polaczenia. Serwer moze byc zbyt zajety, aby przyjmowac nowe polaczenia. Dla gniazd IP czas przeterminowania moze byc bardzo dlugi, gdy na serwerze wlaczone sa ,,syncookies". STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4, 4.4BSD (connect() pojawilo sie pierwotnie w 4.2BSD). UWAGI Jesli connect() zawiedzie, nalezy uznac stan gniazda za nieokreslony. Przenosne aplikacje powinny zamknac gniazdo i utworzyc nowe w celu ponownego polaczenia. PRZYKLADY Przykladowe uzycie connect() pokazano w getaddrinfo(3). ZOBACZ TAKZE accept(2), bind(2), getsockname(2), listen(2), socket(2), path_resolution(7), selinux(8) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 1 listopada 2023 r. connect(2)