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 :
|
| 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));