NOM
socket - Interface Linux aux sockets
SYNOPSIS
#include <sys/socket.h>
sockfd = socket(int socket_family, int socket_type, int protocol);
Cette page de manuel documente l’interface utilisateur de
l’implémentation Linux des sockets réseau. Les sockets compatibles BSD
représentent l’interface uniforme entre le processus utilisateur et les
piles de protocoles réseau dans le noyau. Les modules des protocoles
sont regroupés en familles de protocoles comme AF_INET, AF_IPX,
AF_PACKET et en types de sockets comme SOCK_STREAM ou SOCK_DGRAM. Voyez
socket(2) pour plus d’informations sur les familles et les types de
sockets.
Fonctions du niveau socket
Ces fonctions servent au processus utilisateur pour envoyer ou recevoir
des paquets et pour faire d’autres opérations sur les sockets. Pour
plus de détails, voyez leurs pages de manuel respectives.
socket(2) crée une socket, connect(2) connecte une socket à une adresse
de socket distante, la fonction bind(2) attache une socket à une
adresse locale, listen(2) indique à la socket que de nouvelles
connexions doivent être acceptées, et accept(2) fournit une nouvelle
socket avec la nouvelle connexion entrante. socketpair(2) renvoie deux
sockets anonymes connectées (seulement implémenté pour quelques
familles locales comme AF_UNIX).
send(2), sendto(2), et sendmsg(2) envoient des données sur une socket,
et recv(2), recvfrom(2) et recvmsg(2) reçoivent les données envoyées
par une socket. poll(2) et select(2) attendent que des données arrivent
ou que l’émission soit possible. De plus, les opérations
d’entrée-sortie standard comme write(2), writev(2), sendfile(2),
read(2) et readv(2) peuvent être utilisées pour la lecture et
l’écriture des données.
getsockname(2) renvoie l’adresse de la socket locale et getpeername(2)
renvoie l’adresse de la socket distante. getsockopt(2) et setsockopt(2)
servent à définir et obtenir les options de la couche socket ou
protocole. ioctl(2) peut être utilisé pour lire et écrire d’autres
options.
close(2) sert à fermer une socket. shutdown(2) ferme une partie des
connexions d’une socket multiple.
La recherche ou l’utilisation de pread(2) et pwrite(2) avec un décalage
non nul n’est pas possible sur les sockets.
Des opérations d’entrée-sortie non bloquantes sur les sockets sont
possibles en définissant l’attribut O_NONBLOCK du descripteur de la
socket avec fcntl(2). Toutes les opérations qui devraient normalement
bloquer se terminent alors avec l’erreur EAGAIN (l’opération devra être
retentée ultérieurement). connect(2) renverra l’erreur EINPROGRESS.
L’utilisateur peut alors attendre divers événements avec poll(2) ou
select(2).
+---------------------------------------------------------------+
| Événements E/S |
+-------------+---------+---------------------------------------+
|Événement | Appel | Circonstance |
+-------------+---------+---------------------------------------+
|Lecture | POLLIN | Arrivée de nouvelles données |
+-------------+---------+---------------------------------------+
|Lecture | POLLIN | Configuration d’une connexion achevée |
| | | (pour les sockets orientées |
| | | connexion) |
+-------------+---------+---------------------------------------+
|Lecture | POLLHUP | Demande de déconnexion initiée par |
| | | l’autre extrémité |
+-------------+---------+---------------------------------------+
|Lecture | POLLHUP | Connexion rompue (seulement pour les |
| | | protocoles orientés connexion) Lors |
| | | de l’écriture sur la socket, le |
| | | signal SIGPIPE est aussi émis. |
+-------------+---------+---------------------------------------+
|Écriture | POLLOUT | La socket a assez de place dans le |
| | | tampon d’émission pour écrire de |
| | | nouvelles données. |
+-------------+---------+---------------------------------------+
|Lect./Écrit. | POLLIN| | Un appel sortant à connect(2) est |
| | POLLOUT | terminé. |
+-------------+---------+---------------------------------------+
|Lect./Écrit. | POLLERR | Une erreur asynchrone s’est produite. |
+-------------+---------+---------------------------------------+
|Lect./Écrit. | POLLHUP | Le correspondant a clos un sens de |
| | | communication. |
+-------------+---------+---------------------------------------+
|Exception | POLLPRI | Arrivée de données urgentes. SIGURG |
| | | est alors envoyé. |
+-------------+---------+---------------------------------------+
Une alternative à poll(2) et select(2) est de laisser le noyau informer
l’application des événements par l’intermédiaire d’un signal SIGIO.
Pour cela, l’attribut O_ASYNC doit être défini sur un descripteur de
fichier de la socket via fcntl(2) et un gestionnaire de signal valable
pour SIGIO doit être installé avec sigaction(2). Voyez les remarques
sur les Signaux ci-dessous.
Options de sockets
Ces options communes à toutes les sockets peuvent être définies en
utilisant setsockopt(2) et lues avec getsockopt(2) avec le niveau de
socket positionné à SOL_SOCKET.
SO_ACCEPTCONN
Renvoie une valeur indiquant si la socket a été déclarée comme
acceptant les connexions à l’aide de listen(2). La valeur 0
indique que la socket n’est pas en attente de connexions et la
valeur 1 indique que la socket accepte les connexions. Cette
option ne peut être lue qu’avec getsockopt(2).
SO_BINDTODEVICE
Attache cette socket à un périphérique donné, tel que « eth0 »,
comme indiqué dans le nom d’interface transmis. Si le nom est
une chaîne vide ou si la longueur de l’option est nulle, la
socket est détachée du périphérique. L’option transmise est une
chaîne de longueur variable terminée par un caractère nul,
contenant le nom de l’interface, la longueur maximale étant
IFNAMSIZ. Si une socket est attachée à une interface, seuls les
paquets reçus de cette interface particulière sont traités par
la socket. Cela ne fonctionne que pour certains types de
sockets, en particulier les sockets AF_INET. Ceci n’est pas géré
pour les sockets de paquets (utilisez pour cela bind(8)).
SO_BROADCAST
Définit ou lit l’attribut de diffusion. Lorsqu’il est activé,
les sockets de datagrammes reçoivent les paquets envoyés à
l’adresse de diffusion et peuvent envoyer des paquets à une
adresse de diffusion. Cette option n’a aucun effet sur les
sockets orientées flux.
SO_BSDCOMPAT
Active la compatibilité BSD bogue-à-bogue. Cela est utilisé par
le module du protocole UDP de Linux 2.0 et 2.2. Si cette
compatibilité est activée, les erreurs ICMP reçues pour une
socket UDP ne seront pas transmises au programme utilisateur.
Dans les versions récentes du noyau, la gestion de cette option
a été abandonnée progressivement : Linux 2.4 l’ignore
silencieusement et Linux 2.6 génère une alerte noyau (printk())
si le programme utilise cette option. Linux 2.0 activait
également les options de compatibilité BSD bogue-à-bogue
(modification aléatoire des en-têtes, non prise en compte de
l’attribut de diffusion) pour les sockets brutes ayant cette
option, mais cela a été éliminé dans Linux 2.2.
SO_DEBUG
Active le débogage de socket. Cela n’est autorisé que pour les
processus avec la capacité CAP_NET_ADMIN ou un identifiant
d’utilisateur effectif égal à 0.
SO_ERROR
Lit et efface l’erreur en cours sur la socket. Cela n’est valide
qu’avec getsockopt(2). Demande un entier.
SO_DONTROUTE
Ne pas émettre par l’intermédiaire d’une passerelle, n’envoyer
qu’aux hôtes directement connectés. Le même effet peut être
obtenu avec l’attribut MSG_DONTROUTE durant une opération
send(2) sur la socket. Demande un attribut entier booléen.
SO_KEEPALIVE
Active l’émission de messages périodiques gardant la socket
ouverte pour les sockets orientées connexion. Demande un
attribut entier booléen.
SO_LINGER
Définit ou lit l’option SO_LINGER. Le paramètre est une
structure linger.
struct linger {
int l_onoff; /* définition de l’activité */
int l_linger; /* durée d’attente en secondes */
};
Lorsque ce paramètre est actif, un appel à close(2) ou
shutdown(2) ne se terminera pas avant que tous les messages en
attente pour la socket aient été correctement émis ou que le
délai d’attente soit écoulé. Sinon, l’appel se termine
immédiatement et la fermeture est effectuée en arrière-plan.
Lorsque la socket est fermée au cours d’un exit(2), elle attend
toujours en arrière-plan.
SO_OOBINLINE
Si cette option est activée, les données hors bande sont placées
directement dans le flux des données reçues. Sinon, elles ne
sont transmises que si l’attribut MSG_OOB est définit durant la
réception.
SO_PASSCRED
Autorise ou interdit la réception des messages de contrôle
SCM_CREDENTIALS. Pour plus de détails, voyez unix(7).
SO_PEERCRED
Renvoie les données d’authentification du processus étranger
connecté à cette socket. Cela n’est possible que pour les
sockets de flux AF_UNIX connectées et les paires de sockets
AF_UNIX de flux et de datagrammes crées avec socketpair(2) ;
voyez unix(7). Les données retournées sont celles qui étaient
effectives au moment de l’appel à connect(2) ou socketpair(2).
L’argument est une structure ucred. Cette option n’est valable
qu’avec getsockopt(2).
SO_PRIORITY
Fixe la priorité définie par le protocole pour tous les paquets
envoyés sur la socket. Linux utilise cette valeur pour trier les
files réseau : les paquets avec une priorité élevée peuvent être
traités d’abord, en fonction de la gestion des files sur le
périphérique. Pour ip(7), ceci fixe aussi le champ IP
Type-Of-Service (TOS) pour les paquets sortants. Établir une
priorité en dehors de l’intervalle allant de 0 à 6 nécessite la
capacité CAP_NET_ADMIN.
SO_RCVBUF
Définit ou lit la taille maximale en octets du tampon de
réception. Le noyau double cette valeur (pour prévoir de
l’espace pour les opérations de service) lorsque la valeur est
définie avec setsockopt(2), et cette valeur doublée est
retournée par getsockopt(2). La valeur par défaut est définie
par le fichier /proc/sys/net/core/rmem_default et la valeur
maximale autorisée est fixée par le fichier
/proc/sys/net/core/rmem_max. La valeur (doublée) minimale pour
cette option est 256.
SO_RCVBUFFORCE (depuis Linux 2.6.14)
En utilisant cette option de socket, un processus privilégié
(CAP_NET_ADMIN) peut exécuter la même tâche que SO_RCVBUF, mais
la limite rmem_max peut être remplacée.
SO_RCVLOWAT et SO_SNDLOWAT
Indique le nombre minimal d’octets dans le tampon pour que la
couche socket passe les données au protocole (SO_SNDLOWAT) ou à
l’utilisateur en réception (SO_RCVLOWAT). Ces deux valeurs sont
initialisées à 1. SO_SNDLOWAT n’est pas modifiable
(setsockopt(2) échoue avec l’erreur ENOPROTOOPT). SO_RCVLOWAT
est modifiable seulement depuis Linux 2.4. Les appels système
select(2) et poll(2) ne respectent pour le moment pas la
définition de SO_RCVLOWAT sur Linux, et marque la socket comme
lisible même lorsqu’un unique octet de données est disponible.
La lecture suivante depuis la socket sera bloquée jusqu’à ce que
SO_RCVLOWAT octets soient disponibles.
SO_RCVTIMEO et SO_SNDTIMEO
Indique le délai maximal d’émission ou de réception avant de
signaler une erreur. Le paramètre est une structure timeval. Si
une fonction d’entrée ou de sortie bloque pendant cet intervalle
de temps et que des données ont été envoyées ou reçues, la
valeur de retour de cette fonction sera la quantité de données
transmises ; si aucune donnée n’a été transmise et si le délai
d’attente est atteint, -1 est renvoyé et errno est positionnée à
EAGAIN ou EWOULDBLOCK, comme si la socket avait été définie
comme non bloquante. Si le délai d’attente est défini à zéro
(valeur par défaut), l’opération ne sera jamais interrompue. Les
délais n’ont d’effet que pour les appels système faisant des E/S
sur des sockets (par exemple read(2), recvmsg(2), send(2),
sendmsg(2)) ; ils n’ont pas d’effet pour select(2), poll(2),
epoll_wait(2), etc.
SO_REUSEADDR
Indique que les règles utilisées pour la validation des adresses
fournies dans un appel à bind(2) doivent autoriser la
réutilisation des adresses locales. Pour les sockets AF_INET,
cela signifie que la socket peut être attachée à n’importe
quelle adresse sauf lorsqu’une socket active en écoute y est
liée. Lorsque la socket en écoute est attachée à INADDR_ANY avec
un port spécifique, il n’est pas possible de s’attacher à ce
port quelle que soit l’adresse locale. L’argument est un
attribut booléen entier.
SO_SNDBUF
Définit ou lit la taille maximale en octets du tampon
d’émission. Le noyau double cette valeur (pour prévoir de
l’espace pour les opérations de service) lorsque la valeur est
définie avec setsockopt(2), et cette valeur doublée est
retournée par getsockopt(2). La valeur par défaut est définie
par le fichier /proc/sys/net/core/wmem_default et la valeur
maximale autorisée est fixée par le fichier
/proc/sys/net/core/wmem_max. La valeur (doublée) minimale pour
cette option est 2048.
SO_SNDBUFFORCE (depuis Linux 2.6.14)
En utilisant cette option de socket, un processus privilégié
(CAP_NET_ADMIN) peut exécuter la même tâche que SO_SNDBUF, mais
la limite wmem_max peut être remplacée.
SO_TIMESTAMP
Active ou désactive la réception des messages de contrôle
SO_TIMESTAMP. Le message de contrôle d’horodatage est envoyé
avec le niveau SOL_SOCKET et le champ cmsg_data est une
structure timeval indiquant la date de réception du dernier
paquet fourni à l’utilisateur dans cet appel. Voyez cmsg(3) pour
plus de détails sur les messages de contrôle.
SO_TYPE
Lit le type de socket, sous forme d’entier (comme SOCK_STREAM).
Ne peut être lu qu’avec getsockopt(2).
Signaux
Lors de l’écriture sur une socket orientée connexion qui a été fermée
(localement ou à l’autre extrémité), le signal SIGPIPE est envoyé au
processus qui écrivait, et EPIPE est renvoyé. Le signal n’est pas
envoyé lorsque l’appel d’écriture indiqué contenait l’attribut
MSG_NOSIGNAL.
Lorsque demandé avec l’option FIOSETOWN de fcntl(2) ou l’option
SIOCSPGRP de ioctl(2), le signal SIGIO est envoyé quand un événement
d’entrée-sortie a lieu. Il est possible d’utiliser poll(2) ou select(2)
dans le gestionnaire de signal pour savoir sur quelle socket
l’événement s’est produit. Une alternative (sous Linux 2.2) est de
définir un signal en temps réel avec le fnctl(2) F_SETSIG. Le
gestionnaire du signal en temps réel sera appelé avec le descripteur de
fichier dans le champ si_fd de siginfo_t. Voyez fcntl(2) pour plus
d’informations.
Dans certains cas (par exemple, différents processus accédant à la même
socket), la condition ayant déclenché le signal SIGIO peut avoir déjà
disparu quand le processus réagit au signal. Si cela se produit, le
processus devrait attendre à nouveau car Linux renverra ce signal
ultérieurement.
Interfaces /proc
Les paramètres réseau de base des sockets sont accessibles en utilisant
les fichiers du répertoire /proc/sys/net/core/.
rmem_default
contient la taille en octets par défaut du tampon de réception.
rmem_max
contient la taille maximale en octets du tampon de réception
qu’un utilisateur peut définir avec l’option SO_RCVBUF de la
socket.
wmem_default
contient la taille en octets par défaut du tampon d’émission de
la socket.
wmem_max
contient la taille maximale en octets du tampon d’émission qu’un
utilisateur peut définir avec l’option SO_SNDBUF de la socket.
message_cost et message_burst
configurent le filtrage par jeton utilisé pour limiter la charge
des message d’avertissement dus aux événements réseau
extérieurs.
netdev_max_backlog
contient le nombre maximal de paquets dans la file d’entrée
globale.
optmem_max
contient la taille maximale par socket des données de service et
des données de contrôle utilisateur comme les iovecs.
Ioctls
Ces opérations sont accessibles en utilisant ioctl(2) :
error = ioctl(ip_socket, type_ioctl, &valeur_rsultat);
SIOCGSTAMP
Renvoie une structure timeval avec la date de réception du
dernier paquet transmis à l’utilisateur. Cela est utile pour des
mesures précises du temps de cheminement. Voyez setitimer(2)
pour une description de la structure timeval. L’ioctl ne doit
être utilisé que si l’option SO_TIMESTAMP de la socket n’est pas
définie. Sinon, la date du dernier paquet reçu quand
SO_TIMESTAMP n’était pas définie est renvoyée, provoquant un
échec s’il n’exite pas de tels paquets (c’est-à-dire que
ioctl(2) renvoie -1 avec un errno défini à ENOENT).
SIOCSPGRP
Définit le processus ou le groupe de processus à qui envoyer les
signaux SIGIO ou SIGURG lorsqu’une opération d’entrée-sortie
asynchrone est terminée ou si des données urgentes sont
disponibles. L’argument est un pointeur sur un pid_t. Si
l’argument est positif, le signal est envoyé à ce processus.
S’il est négatif, le signal est envoyé au groupe de processus
dont l’identifiant correspond à la valeur absolue de l’argument.
Un processus ne peut demander que l’émission vers lui-même ou
son propre groupe, à moins qu’il ait la capacité CAP_KILL ou un
identifiant d’utilisateur effectif nul.
FIOASYNC
Change l’attribut O_ASYNC pour activer ou désactiver le mode
d’entrée-sortie asynchrone de la socket. Un mode d’entrée-sortie
asynchrone signifie que le signal SIGIO ou le signal fixé avec
F_SETSIG est envoyé quand un événement d’entrée-sortie se
produit.
Le paramètre est un booléen entier. (Cette opération est
synonyme de l’utilisation de fcntl(2) pour définir l’attribut
O_ASYNC).
SIOCGPGRP
Lit le processus ou le groupe de processus auquel les signaux
SIGIO ou SIGURG sont envoyés. Zéro est obtenu quand aucun n’est
défini.
Opérations fcntl(2) valables :
FIOGETOWN
Identique à l’ioctl(2) SIOCGPGRP.
FIOSETOWN
Identique à l’ioctl(2) SIOCSPGRP.
VERSIONS
SO_BINDTODEVICE a été introduit dans Linux 2.0.30. SO_PASSCRED est une
nouveauté de Linux 2.2. Les interfaces /proc ont été introduites dans
Linux 2.2. SO_RCVTIMEO et SO_SNDTIMEO sont gérés depuis Linux 2.3.41.
Auparavant, les délais d’attente étaient définis dans les protocoles et
ne pouvaient être ni lus ni modifiés.
NOTES
Linux suppose que la moitié du tampon d’émission/réception est utilisé
pour les structures internes du noyau. Ainsi les valeurs dans les
fichiers /proc correspondants sont deux fois plus grandes que ce que
l’on peut observer directement sur le câble.
Linux ne permettra la réutilisation des ports qu’avec l’option
SO_REUSEADDR lorsque celle-ci sera définie à la fois par le précédent
programme qui a effectué un bind(2) sur le port et par le programme qui
veut réutiliser ce port. Ceci diffère de certaines implémentations (par
exemple, sur FreeBSD) où seul le dernier programme doit définir
l’option SO_REUSEADDR. Habituellement, cette différence est invisible,
puisque, par exemple, un programme serveur est conçu pour toujours
définir cette option.
BOGUES
Des options CONFIG_FILTER de socket, SO_ATTACH_FILTER et
SO_DETACH_FILTER, ne sont pas documentées. Pour les utiliser, il est
conseillé d’utiliser la bibliothèque libpcap.
VOIR AUSSI
getsockopt(2), setsockopt(2), socket(2), capabilities(7), ddp(7),
ip(7), packet(7), tcp(7), udp(7), unix(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».