connect - Débuter une connexion sur un socket
Bibliothèque C standard (
libc,
-lc)
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
L'appel système
connect() connecte le socket associé au
descripteur de fichier
sockfd à l'adresse indiquée par
addr. L'argument
addrlen indique la taille de
addr. Le
format de l'adresse
addr est déterminé par la famille du
socket
sockfd ; consultez
socket(2) pour plus de
détails.
Si le socket
sockfd est du type
SOCK_DGRAM, alors
addr est
l'adresse à laquelle les datagrammes seront envoyés par
défaut, et la seule adresse depuis laquelle ils seront reçus. Si
le socket est du type
SOCK_STREAM ou
SOCK_SEQPACKET, cette
fonction tente de se connecter à un autre socket. L'adresse de l'autre
socket est indiquée par
addr.
Certains sockets de protocole (comme les sockets de flux de domaine UNIX)
peuvent
connect() avec succès une seule fois.
Certains sockets de protocole (comme les sockets datagramme des domaines UNIX et
Internet) peuvent utiliser
connect() plusieurs fois pour modifier leur
association.
Certains sockets (comme les sockets TCP ainsi que les sockets datagramme des
domaines UNIX et Internet) peuvent rompre l'association en se connectant
à une adresse avec le membre
sa_family de
sockaddr
positionné sur
AF_UNSPEC;, le socket peut par la suite se
connecter à une autre adresse (
AF_UNSPEC est pris en charge sur
Linux depuis Linux 2.2).
connect() renvoie
0 s'il réussit, ou
-1 s'il
échoue, auquel cas
errno est positionné pour indiquer
l'erreur.
Voici une liste d'erreurs générales concernant les sockets. Il
peut en exister d'autres spécifiques au domaine employé.
- EACCES
- Pour les sockets de domaine UNIX qui sont
spécifiés par un nom de chemin : la permission en
écriture est refusée sur le fichier socket, ou la permission
de parcours est refusée pour l'un des répertoires composant
le chemin. (Consultez aussi path_resolution(7).)
-
EACCES, EPERM
- L'utilisateur a tenté de se connecter à une
adresse broadcast sans avoir activé l'attribut broadcast, ou la
demande de connexion a échoué à cause des
règles d'un pare-feu local.
- EACCES
- Ces codes d'erreur peuvent aussi être
renvoyés si une règle SELinux a interdit une connexion (par
exemple si une règle prévoit qu'un mandataire HTTP ne peut
se connecter qu'à des ports associés à des serveurs
HTTP et que le mandataire essaie de se connecter à un autre
port).
- EADDRINUSE
- L'adresse locale est déjà
utilisée.
- EADDRNOTAVAIL
- (Sockets Internet) Le socket indiqué par
sockfd n'a pas encore été attaché a une
adresse, et lors d'une tentative d'attachement à un port
éphémère, aucun port n'était disponible dans
l'intervalle des ports éphémères. Consultez les
explications concernant /proc/sys/net/ipv4/ip_local_port_range dans
ip(7).
- EAFNOSUPPORT
- L'adresse transmise n'a pas la bonne valeur dans son champ
sa_family.
- EAGAIN
- Pour les sockets de domaine UNIX non bloquants, le socket
n'est pas bloquant et la connexion ne peut pas être établie
immédiatement. Pour les autres familles de sockets, il n'y a pas
assez d'entrées dans le cache de routage.
- EALREADY
- Le socket est non bloquant et une tentative de connexion
précédente ne s'est pas encore terminée.
- EBADF
-
sockfd n'est pas un descripteur de fichier
valable.
- ECONNREFUSED
- La connect() à un socket de flux n'a rien
trouvé qui écoutait à l'adresse distante.
- EFAULT
- La structure d'adresse pointe en dehors de l'espace
d'adressage.
- EINPROGRESS
- Le socket est non bloquant et la connexion ne peut pas
être établie immédiatement (les sockets de domaines
UNIX échouaient plutôt avec EAGAIN). Il est alors
possible d'utiliser select(2) ou poll(2) pour attendre que
le socket soit disponible en écriture. Une fois que
select(2) confirme la possibilité d'écrire, utilisez
getsockopt(2) pour lire l'option SO_ERROR du niveau
SOL_SOCKET et déterminer si connect() s'est
terminé avec succès ( SO_ERROR vaut zéro) ou
en échec ( SO_ERROR contient l'un des codes d'erreurs
listés ici, indiquant le problème).
- EINTR
- L'appel système a été interrompu par
la réception d'un signal ; consultez signal(7).
- EISCONN
- Le socket est déjà connecté.
- ENETUNREACH
- Le réseau est inaccessible.
- ENOTSOCK
- Le descripteur de fichier sockfd ne fait pas
référence à un socket.
- EPROTOTYPE
- Le protocole de communication demandé n'est pas
accepté par le type de socket. Cette erreur peut se produire, par
exemple, lors d'une tentative de connexion d'un socket de datagramme UNIX
avec un socket de flux.
- ETIMEDOUT
- Dépassement du délai maximal pendant la
connexion. Le serveur peut être trop chargé pour accepter
une nouvelle connexion. Remarquez que pour les sockets IP, le délai
peut être très long si les syncookies sont activés
sur le serveur.
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD, (
connect() est apparu dans
BSD 4.2).
Pour plus de détails sur le type
socklen_t, voir
accept(2).
Si
connect() échoue, considérez que le socket est dans un
état non spécifié. Les applications portables devraient
fermer le socket et en créer un nouveau pour se reconnecter.
getaddrinfo(3) contient un exemple d'utilisation de
connect().
accept(2),
bind(2),
getsockname(2),
listen(2),
socket(2),
path_resolution(7),
selinux(8)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]>,
Cédric Boutillier <
[email protected]>,
Frédéric Hantrais <
[email protected]> et Jean-Philippe
MENGUAL <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]