table of contents
connect(2) | System Calls Manual | 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 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.
2 maja 2024 r. | Linux man-pages (niewydane) |