connect - inicjuje połączenie poprzez gniazdo
Standardowa biblioteka C (libc, -lc)
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
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).
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.
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”.
POSIX.1-2001, SVr4, 4.4BSD (connect() pojawiło
się pierwotnie w 4.2BSD).
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.
Tłumaczenie niniejszej strony podręcznika: 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.