socket

Section: System Calls (2)
Updated: 5 février 2023
Index Return to Main Contents
 

NOM

socket - Créer un point de communication  

BIBLIOTHÈQUE

Bibliothèque C standard (libc, -lc)  

SYNOPSIS

#include <sys/socket.h>

int socket(int domain, int type, int protocol);
 

DESCRIPTION

socket() crée un point de communication et renvoie un descripteur de fichier qui s'y rapporte. Le descripteur de fichier renvoyé par un appel réussi sera celui au numéro le plus bas qui n'est pas ouvert actuellement pour le processus.

Le paramètre domain indique le domaine de communication ; cela sélectionne la famille de protocole à employer. Elles sont définies dans le fichier <sys/socket.h>. Les formats actuellement compris par le noyau Linux sont :
Nom ObjectifPage de manuel
AF_UNIX   Communication locale unix(7)
AF_LOCAL   Synonyme de AF_UNIX
AF_INET  Protocoles Internet IPv4 ip(7)
AF_AX25   Protocole radio amateur AX.25 ax25(4)
AF_IPX  IPX - Protocoles Novell
AF_APPLETALK  AppleTalk ddp(7)
AF_X25  Protocole ITU-T X.25 / ISO-8208 x25(7)
AF_INET6  Protocoles Internet IPv6 ipv6(7)
AF_DECnet   Sockets de protocole DECet
AF_KEY   Protocole de gestion de clé, développé à l'origine pour être utilisé avec IPsec
AF_NETLINK   Interface utilisateur noyau netlink(7)
AF_PACKET   Interface paquet bas-niveau packet(7)
AF_RDS   Protocole Reliable Datagram Sockets (RDS) rds(7)
rds-rdma(7)
AF_PPPOX   Couche de transport PPP générique pour paramétrer des tunnels L2 (L2TP et PPPoE)
AF_LLC   Protocole de contrôle de lien logique (IEEE 802.2 LLC)
AF_IB   Adressage natif InfiniBand
AF_MPLS   Multiprotocole Label Switching
AF_CAN   Protocole du bus Controller Area Network automotive
AF_TIPC   Protocole TIPC, « sockets de domaine de grappe »
AF_BLUETOOTH   Protocole du socket de bas niveau Bluetooth
AF_ALG   Interface avec l'API de chiffrement du noyau
AF_VSOCK   Protocole VSOCK (initialement « VMWare VSockets ») de communication hyperviseur-invité vsock(7)
AF_KCM   Interface KCM (multiplexeur de connexion au noyau)
AF_XDP   Interface XDP (express data path)

Vous pouvez trouver plus de détails sur les familles d'adresses ci-dessus, ainsi que des informations sur plusieurs autres familles d'adresses, dans address_families(7).

Le socket a le type indiqué, ce qui indique la sémantique des communications. Les types définis actuellement sont :

SOCK_STREAM
Support de dialogue garantissant l'intégrité, fournissant un flux de données binaires, et intégrant un mécanisme pour les transmissions de données hors-bande.
SOCK_DGRAM
Prise en charge des datagrammes (transmissions sans connexion, non garantie, de datagrammes de longueur maximale fixe).
SOCK_SEQPACKET
Dialogue garantissant l'intégrité, pour le transport de datagrammes de longueur fixe. Le lecteur doit lire le paquet de données complet à chaque appel système récupérant l'entrée.
SOCK_RAW
Accès direct aux données réseau.
SOCK_RDM
Transmission fiable de datagrammes, sans garantie de l'ordre de délivrance.
SOCK_PACKET
Obsolète, à ne pas utiliser dans les programmes actuels. Consultez packet(7).

Certains types de sockets peuvent ne pas être implémentés par toutes les familles de protocoles.

Depuis Linux 2.6.27, le paramètre type a un autre objectif : en plus d'indiquer le type de socket, il peut inclure les valeurs suivantes en les combinant par un OU binaire, pour modifier le comportement de socket() :

SOCK_NONBLOCK
Placer l'attribut d'état de fichier O_NONBLOCK sur la description du fichier ouvert référencée par le nouveau descripteur de fichier (consulter open(2)). Utiliser cet attribut économise des appels supplémentaires à fcntl(2) pour obtenir le même résultat.
SOCK_CLOEXEC
Placer l'attribut « close-on-exec » (FD_CLOEXEC) sur le nouveau descripteur de fichier. Consultez la description de l'attribut O_CLOEXEC dans open(2) pour savoir pourquoi cela peut être utile.

Le protocole à utiliser sur le socket est indiqué par l'argument protocol. Normalement, il n'y a qu'un seul protocole par type de socket pour une famille donnée, auquel cas l'argument protocol peut être nul. Néanmoins, rien ne s'oppose à ce que plusieurs protocoles existent, auquel cas il est nécessaire de le spécifier. Le numéro de protocole dépend du domaine de communication du socket ; consultez protocols(5). Consultez getprotoent(3) pour savoir comment associer un nom de protocole à un numéro.

Des sockets de type SOCK_STREAM sont des flux d'octets full-duplex. Ils ne préservent pas les limites d'enregistrements. Un socket SOCK_STREAM doit être dans un état connecté avant que des données puissent y être lues ou écrites. Une connexion sur un autre socket est établie par l'appel système connect(2). Une fois connecté, les données y sont transmises par read(2) et write(2) ou par des variantes de send(2) et recv(2). Quand une session se termine, on referme le socket avec close(2). Les données hors-bande sont envoyées ou reçues comme il est décrit dans send(2) et recv(2).

Les protocoles de communication qui implémentent les sockets SOCK_STREAM garantissent qu'aucune donnée n'est perdue ou dupliquée. Si un bloc de données, pour lequel le correspondant a suffisamment de place dans son tampon, n'est pas transmis correctement dans un délai raisonnable, la connexion est considérée comme inutilisable. Si l'option SO_KEEPALIVE est activée sur le socket, le protocole vérifie, d'une manière qui lui est spécifique, si le correspondant est toujours actif. Un signal SIGPIPE est envoyé au processus tentant d'écrire sur un socket inutilisable, forçant les programmes ne gérant pas ce signal à se terminer. Les sockets de type SOCK_SEQPACKET emploient les mêmes appels système que ceux de types SOCK_STREAM, à la différence que la fonction read(2) ne renverra que le nombre d'octets requis, et toute autre donnée restante dans le paquet sera éliminée. De plus, les frontières des messages seront préservées.

Les sockets de type SOCK_DGRAM ou SOCK_RAW permettent l'envoi de datagrammes aux correspondants indiqués dans l'appel système sendto(2). Les datagrammes sont généralement lus par la fonction recvfrom(2), qui fournit également l'adresse du correspondant.

Les sockets SOCK_PACKET sont obsolètes. Ils servent à recevoir les paquets bruts directement depuis le gestionnaire de périphérique. Utilisez plutôt packet(7).

Un appel à fcntl(2) avec l'argument F_SETOWN permet de préciser un processus ou un groupe de processus qui recevront un signal SIGURG lors de l'arrivée de données hors-bande, ou le signal SIGPIPE lorsqu'une connexion sur un socket SOCK_STREAM se termine inopinément. Cette fonction permet également de définir le processus ou groupe de processus qui recevront une notification asynchrone des événements d'entrées-sorties par le signal SIGIO. L'utilisation de F_SETOWN est équivalent à un appel ioctl(2) avec l'argument FIOSETOWN ou SIOCSPGRP.

Lorsque le réseau indique une condition d'erreur au module du protocole (par exemple avec un message ICMP pour IP), un drapeau signale une erreur en attente sur le socket. L'opération suivante sur ce socket renverra ce code d'erreur. Pour certains protocoles, il est possible d'activer une file d'attente d'erreurs par socket. Pour plus de détails, consultez IP_RECVERR dans ip(7).

Les opérations sur les sockets sont contrôlées par des options du niveau socket. Ces options sont définies dans <sys/socket.h>. Les fonctions setsockopt(2) et getsockopt(2) sont utilisées respectivement pour définir ou lire les options.  

VALEUR RENVOYÉE

socket() renvoie un descripteur référençant le socket créé en cas de réussite. En cas d'échec -1 est renvoyé et errno est positionné pour indiquer l'erreur.  

ERREURS

EACCES
La création d'un socket avec le type et le protocole indiqués n'est pas autorisée.
EAFNOSUPPORT
L'implémentation ne supporte pas la famille d'adresses indiquée.
EINVAL
Protocole inconnu, ou famille de protocole inexistante.
EINVAL
Attributs incorrects dans type.
EMFILE
La limite du nombre de descripteurs de fichiers par processus a été atteinte.
ENFILE
La limite du nombre total de fichiers ouverts pour le système entier a été atteinte.
ENOBUFS ou ENOMEM
Pas suffisamment d'espace pour allouer les tampons nécessaires. Le socket ne peut être créé tant que suffisamment de ressources ne sont pas libérées.
EPROTONOSUPPORT
Le type de protocole, ou le protocole lui-même n'est pas disponible dans ce domaine de communication.

D'autres erreurs peuvent être dues aux modules de protocoles sous-jacents.  

STANDARDS

POSIX.1-2001, POSIX.1-2008, 4.4BSD.

Les attributs SOCK_NONBLOCK et SOCK_CLOEXEC sont spécifiques à Linux.

La fonction socket() est apparue dans BSD 4.2. Elle est généralement portable de/vers les systèmes non-BSD supportant des clones des sockets BSD (y compris les variantes de System V).  

NOTES

Les constantes explicites utilisées sous BSD 4.x pour les familles de protocoles sont PF_UNIX, PF_INET, etc. alors que AF_UNIX, AF_INET, etc. sont utilisées pour les familles d'adresses. Toutefois, même la page de manuel de BSD indiquait « La famille de protocoles est généralement la même que la famille d'adresses », et les standards ultérieurs utilisent AF_* partout.  

EXEMPLES

Un exemple d'utilisation de socket() se trouve dans la page de manuel de getaddrinfo(3).  

VOIR AUSSI

accept(2), bind(2), close(2), connect(2), fcntl(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), address_families(7), ip(7), socket(7), tcp(7), udp(7), unix(7)

« An Introductory 4.3BSD Interprocess Communication Tutorial » et « BSB Interprocess Communication Tutorial », réimprimés dans UNIX Programmer's Supplementary Documents Volume 1.

 

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>

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 à


 

Index

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
NOTES
EXEMPLES
VOIR AUSSI
TRADUCTION

This document was created by man2html, using the manual pages.
Time: 13:56:43 GMT, May 22, 2024