sous-routine de connexion

Objectif

Connecte deux sockets.

Bibliothèque

Bibliothèque C standard ( libc.a )

Syntaxe

#include <sys/socket.h>

int connect ( Socket, Name, NameLength )  
int Socket; 
const struct sockaddr *Name;
socklen_t NameLength;

Descriptif

Le sous-programme connect demande une connexion entre deux sockets. Le noyau configure la liaison de communication entre les sockets ; les deux sockets doivent utiliser le même format d'adresse et le même protocole.

Si un sous-programme connect est lancé sur une socket non liée ou partiellement liée, le système lie automatiquement la socket. Un socket partiellement lié est un socket auquel est attribué un numéro de port mais pas d'adresse IP. Le sous-programme connect peut être utilisé pour connecter un socket à lui-même. Une socket peut être connectée à elle-même, en liant une socket à un port local (en utilisant la sous-routine bind ) et en la connectant ensuite au même port avec une adresse IP locale (en utilisant la sous-routine connect ).

Le sous-programme connect effectue une action différente pour chacun des deux types de sockets initiateurs suivants :

  • Si le socket initiateur est SOCK_DGRAM, le sous-programme connect établit l'adresse de l'homologue. L'adresse de l'homologue identifie la socket où tous les datagrammes sont envoyés dans les sous-routines suivantes send suivantes. Aucune connexion n'est établie par ce sous-programme connect. Si la socket UDP reçoit des datagrammes lorsque le sous-programme connect est appelé, le sous-programme modifie l'adresse IP, empêchant ainsi la socket de recevoir des paquets de datagrammes basés sur l'adresse précédente.
  • Si le socket initiateur est SOCK_STREAM ou SOCK_CONN_DGRAM, le sous-programme connect tente d'établir une connexion avec le socket spécifié par le paramètre Name. Chaque espace de communication interprète différemment le paramètre Nom. Pour le type de socket SOCK_CONN_DGRAM et le protocole ATM, la station distante peut modifier certains des paramètres ATM. Si la station distante modifie les paramètres ATM, les applications peuvent demander les nouvelles valeurs des paramètres ATM en utilisant les options de socket appropriées.
  • Pour une socket de domaine UNIX, un appel à connect ne réussit que si le processus qui appelle la sous-routine connect dispose des droits de lecture et d'écriture sur le fichier de socket créé par l'appel à bind. Les autorisations sont déterminées par la valeur umask, qui est la valeur du processus qui a créé le fichier.

Paramètres

Article Descriptif
Socket Indique le nom unique du socket.
nom Spécifie l'adresse du socket cible qui constitue l'autre extrémité de la ligne de communication
NameLength Indique la longueur de la structure d'adresse.

Valeurs renvoyées

En cas de succès, le sous-programme connect renvoie la valeur 0.

Si la sous-routine connect n'aboutit pas, le gestionnaire du système exécute les fonctions suivantes :

  • Renvoie une valeur de -1 au programme appelant.
  • Déplace un code d'erreur, indiquant l'erreur spécifique, dans la variable globale errno.

Codes d'erreur

Le sous-programme connect échoue si l'une des erreurs suivantes se produit :

Valeur Descriptif
EADDRINUSE L'adresse spécifiée est déjà utilisée. Cette erreur se produit également si l'option de socket SO_REUSEADDR a été définie et que l'adresse locale (qu'elle soit spécifiée ou sélectionnée par le système) est déjà utilisée.
EADDRNOTAVAIL L'adresse indiquée n'est pas disponible à partir de la machine locale.
EAFNOSUPPORT Les adresses de la famille d'adresses spécifiée ne peuvent pas être utilisées avec ce socket.
DEJA La socket est spécifiée avec le drapeau O_NONBLOCK ou O_NDLAY, et une tentative de connexion précédente n'est pas encore terminée.
EINTR La tentative d'établissement d'une connexion a été interrompue par la délivrance d'un signal qui a été capté. La connexion est établie de manière asynchrone.
EACCES Le droit de recherche est refusé sur un composant du préfixe de chemin ou l'accès en écriture au socket nommé est refusé.
ENOBUFS Le système a manqué de mémoire pour une structure de données interne.
EOPNOTSUPP Le socket référencé par le paramètre Socket ne prend pas en charge connect.
BLOC-ewouldblock La plage allouée aux ports éphémères TCP/UDP est épuisée.
EBADF Le paramètre Socket n'est pas valide.
ECONNREFUSE La tentative de connexion a été rejetée.
EFAULT Le paramètre Adresse ne se trouve pas dans une partie inscriptible de l'espace adresse de l'utilisateur.
EINPROGRESS Le socket est marqué comme non bloquant. La connexion ne peut pas être établie immédiatement. Le programme d'application peut sélectionner le socket à écrire lors du processus de connexion.
EINVAL Cette erreur se produit dans les cas suivants :
  • Le nom de chemin spécifié contient un caractère avec le jeu de bits de poids fort.
  • Si l'appel précédent à la sous-routine connect échoue. Dans ce cas, fermez et rouvrez le socket qui est en état d'erreur et tentez à nouveau d'appeler le sous-programme connect.
EISCONN Le socket est déjà connecté.
ENETDOWN Le réseau physique indiqué est arrêté.
ENETUNREACH Aucune route vers le réseau ou l'hôte n'est présente.
ENOSPC Il ne reste plus d'espace dans la table d'un appareil ou d'un système.
ENOTCONN Il se peut que la prise ne soit pas connectée.
ENOTSOCK Le paramètre Socket fait référence à un fichier et non à un socket.
ETIMEDOUT L'établissement d'une connexion a expiré avant l'établissement d'une connexion.
EPROTOTYPE Le type de l'adresse spécifiée est différent de celui du socket lié à l'adresse homologue spécifiée.
ELOOP Trop de liens symboliques ont été rencontrés lors de la conversion du nom du chemin dans l'adresse.
ENOENT Un composant du nom de chemin ne désigne pas un fichier existant ou le nom de chemin est une chaîne vide.
REP_ENOT Un composant du préfixe du nom du chemin dans l'adresse n'est pas un répertoire.

Exemples

Le fragment de programme suivant illustre l'utilisation de la sous-routine connect par un client pour initier une connexion au socket d'un serveur.

struct sockaddr_un server;
.
.
.
connect(s,(struct sockaddr*)&server, sun_len(&server));