table of contents
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.
- EBADF
- Deskryptor nie jest prawidłowym indeksem tablicy deskryptorów.
- EFAULT
- Adres struktura gniazda znajduje się poza przestrzenią adresową użytkownika.
- ENOTSOCK
- Deskryptor nie jest związany z gniazdem.
- EISCONN
- Gniazdo już jest połączone.
- ECONNREFUSED
- Żaden serwer nie nasłuchuje na zdalnym adresie.
- 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".
- ENETUNREACH
- Sieć jest nieosiągalna.
- EADDRINUSE
- Adres lokalny już jest wykorzystywany.
- EINPROGRESS
- 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).
- EALREADY
- 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.
- EAFNOSUPPORT
- Przekazany adres miał prawidłowej rodziny adresów w swoim polu sa_family.
- 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 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¶
1998-10-03 | Linux 2.2 |