NOM¶
socket - Interface Linux aux sockets
SYNOPSIS¶
#include <sys/socket.h>
sockfd = socket(int famille_socket, int
type_socket , int protocole);
DESCRIPTION¶
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. Consultez
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, consultez 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| POLLOUT |
Un appel sortant à connect(2) est 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). Consultez 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 de socket peut être seulement lue, et
pas modifiée.
- 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(2)).
- SO_BROADCAST
- Définir ou lire l'attribut de diffusion. Une fois
activé, les sockets de datagrammes sont autorisées à
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_DOMAIN (depuis Linux 2.6.32)
- Récupère le domaine de socket en tant qu'entier,
en renvoyant une valeur telle que AF_INET6. Consultez
socket(2) pour plus de détails. Cette option de socket peut
être seulement lue, et pas modifiée.
- SO_ERROR
- Lit et efface l'erreur en cours sur la socket. Cette option
de socket peut être seulement lue, et pas modifiée. 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_MARK (depuis Linux 2.6.25)
- Positionner la marque pour chaque paquet envoyé au
travers de cette socket (similaire à la cible MARK de netfilter, mais
pour les sockets). Le changement de marque peut être utilisé
pour un routage par marques sans netfilter ou pour le filtrage de paquets.
Utiliser cette option nécessite la capacité
CAP_NET_ADMIN.
- 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éfini durant la réception.
- SO_PASSCRED
- Autorise ou interdit la réception des messages de
contrôle SCM_CREDENTIALS. Pour plus de détails, consultez
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) ; consultez 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 de socket peut être
seulement lue, et pas modifiée.
- SO_PRIORITY
- Définir 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), cela définit 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_PROTOCOL (depuis Linux 2.6.32)
- Récupère le protocole de socket en tant
qu'entier, en renvoyant une valeur telle que IPPROTO_SCTP.
Consultez socket(2) pour plus de détails. Cette option de
socket peut être seulement lue, et pas modifiée.
- 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 définie 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
- Indiquer 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 définie 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. Consultez 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). Cette option de socket peut être seulement lue,
et pas modifiée.
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. Consultez
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 messages 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_résultat);
- 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. Consultez
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 défini 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.44 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¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
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> ».