connect - inițiază o conexiune la un soclu
Biblioteca C standard (libc, -lc)
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Apelul de sistem connect() conectează soclul
menționat de descriptorul de fișier sockfd la adresa
specificată de addr. Argumentul addrlen
specifică dimensiunea lui addr. Formatul adresei din
addr este determinat de spațiul de adresare al soclului
sockfd; consultați socket(2) pentru detalii
suplimentare.
Dacă soclul sockfd este de tip SOCK_DGRAM,
atunci addr este adresa la care sunt trimise implicit datagramele
și singura adresă de la care sunt primite datagramele.
Dacă soclul este de tip SOCK_STREAM sau SOCK_SEQPACKET,
acest apel încearcă să realizeze o conexiune la soclul
care este asociat adresei specificate de addr.
Unele socluri de protocol (de exemplu, socluri de flux de domeniu
UNIX) pot executa cu succes connect() o singură
dată.
Unele socluri de protocol (de exemplu, socluri de tip
datagramă în domeniile UNIX și Internet) pot utiliza
connect() de mai multe ori pentru a-și schimba asocierea.
Unele socluri de protocol (de exemplu, socluri TCP, precum
și socluri datagramă în domeniile UNIX și
Internet) pot dizolva asocierea prin conectarea la o adresă cu
membrul sa_family din sockaddr definit la AF_UNSPEC;
ulterior, soclul poate fi conectat la o altă adresă.
(AF_UNSPEC este acceptat începând cu Linux 2.2.)
Dacă conexiunea sau asocierea reușește, se
returnează zero. În caz de eroare, se returnează -1,
iar errno este configurată pentru a indica eroarea.
Următoarele sunt doar erori generale de soclu. Pot exista
și alte coduri de eroare specifice domeniului.
- EACCES
- Pentru soclurile de domeniu UNIX, care sunt identificate prin nume de
rută: permisiunea de scriere este refuzată pe
fișierul soclu sau permisiunea de căutare este
refuzată pentru unul dintre directoarele din prefixul căii.
A se vedea și path_resolution(7).
- EACCES
- EPERM
- Utilizatorul a încercat să se conecteze la o adresă
de difuzare fără a avea activat fanionul de difuzare al
soclului sau solicitarea de conectare a eșuat din cauza unei reguli
de paravan de protecție local.
- EACCES
- De asemenea, poate fi returnat dacă o politică SELinux a
refuzat o conexiune (de exemplu, dacă există o
politică care spune că un proxy HTTP se poate conecta numai
la porturile asociate cu servere HTTP, iar proxy-ul încearcă
să se conecteze la un port diferit).
- EADDRINUSE
- Adresa locală este deja în uz.
- EADDRNOTAVAIL
- (Soclurile din domeniul de Internet) Soclul la care se face referire prin
sockfd nu a fost asociat anterior unei adrese și, la
încercarea de a-l asocia la un port efemer, s-a stabilit că
toate numerele de port din intervalul de porturi efemere sunt utilizate
în prezent. A se vedea discuția despre
/proc/sys/net/ipv4/ip_local_port_range în ip(7).
- EAFNOSUPPORT
- Adresa furnizată nu avea familia de adrese corectă în
câmpul sa_family.
- EAGAIN
- Pentru soclurile de domeniu UNIX fără blocare, soclul este
fără blocare, iar conexiunea nu poate fi finalizată
imediat. Pentru alte familii de socluri, nu există suficiente
intrări în memoria cache de direcționare.
- EALREADY
- Soclul este fără blocare și o încercare
anterioară de conectare nu a fost încă
finalizată.
- EBADF
- sockfd nu este un descriptor de fișier deschis valid.
- ECONNREFUSED
- Un apel connect() pe un soclu de flux nu a găsit pe nimeni
ascultând la adresa de la distanță.
- EFAULT
- Adresa structurii soclului este în afara spațiului de adrese
al utilizatorului.
- EINPROGRESS
- Soclul este fără blocare și conexiunea nu poate fi
finalizată imediat (soclurile de domeniu UNIX eșuează
în schimb cu EAGAIN). Este posibil să
efectuați select(2) sau poll(2) pentru completare
selectând soclul pentru scriere. După ce select(2)
indică permisiunea de scriere, utilizați
getsockopt(2) pentru a citi opțiunea SO_ERROR la
nivelul SOL_SOCKET pentru a determina dacă connect()
s-a finalizat cu succes (SO_ERROR este zero) sau fără
succes (SO_ERROR este unul dintre codurile de eroare
obișnuite enumerate aici, explicând motivul
eșecului).
- EINTR
- Apelul de sistem a fost întrerupt de un semnal care a fost
capturat; consultați signal(7).
- EISCONN
- Soclul este deja conectat.
- ENETUNREACH
- Rețeaua este inaccesibilă
- ENOTSOCK
- Descriptorul de fișier sockfd nu se referă la un
soclu.
- EPROTOTYPE
- Tipul de soclu nu acceptă protocolul de comunicare solicitat.
Această eroare poate apărea, de exemplu, la o
încercare de conectare a unui soclu de dategramă de domeniu
UNIX la un soclu de flux.
- ETIMEDOUT
- Depășire a timpului de așteptare în timpul
încercării de conectare. Este posibil ca serverul să
fie prea ocupat pentru a accepta noi conexiuni. Rețineți
că pentru soclurile IP timpul de așteptare poate fi foarte
lung atunci când „syncookies” sunt activate pe
server.
POSIX.1-2001, SVr4, 4.4BSD, (connect() a apărut
pentru prima dată în 4.2BSD).
Dacă connect() eșuează,
considerați starea soclului ca fiind nespecificată.
Aplicațiile portabile ar trebui să închidă
soclul și să creeze unul nou pentru reconectare.
Un exemplu de utilizare a apelului de sistem connect(),
este prezentat în getaddrinfo(3).
Traducerea în limba română a acestui manual a
fost făcută de Remus-Gabriel Chelu
<remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită;
citiți
Licența
publică generală GNU Versiunea 3 sau o versiune
ulterioară cu privire la condiții privind drepturile de autor.
NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea
acestui manual, vă rugăm să trimiteți un e-mail
la
translation-team-ro@lists.sourceforge.net.