SOCKET
Section : Manuel de l'administrateur Linux (
7)
Mise à jour de la version anglaise : 28 décembre 2007
Index
Menu principal
NOM
socket - Interface Linux des sockets
SYNOPSIS
#include <sys/socket.h>
mysocket = socket(int socket_family, int socket_type, int protocol);
DESCRIPTION
Cette page de manuel documente l'interface utilisateur de l'implémentation
Linux des sockets réseau.
Les sockets compatibles BSD représentent une interface uniforme entre le
processus utilisateur et les piles de protocoles réseau dans le noyau.
Les modules des protocoles sont groupés en
familles de protocoles
comme
PF_INET,
PF_IPX,
PF_PACKET
et en
types de sockets
comme
SOCK_STREAM
ou
SOCK_DGRAM.
Voir
socket(2)
pour plus de détails sur les familles et les types de sockets.
Fonctions de la couche socket
Ces fonctions servent à un processus utilisateur pour envoyer ou recevoir
des paquets et pour faire d'autres opérations sur les sockets.
Pour plus de détails, voir 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 y ê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
PF_UNIX)
send(2),
sendto(2),
et
sendmsg(2)
envoient des données sur une socket, et
recv(2),
recvfrom(2),
recvmsg(2)
reçoivent des données depuis 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ées-sorties standard comme
write(2),
writev(2),
sendfile(2),
read(2),
et
readv(2)
peuvent servir à écrire ou lire des données.
getsockname(2)
renvoie l'adresse locale d'une socket et
getpeername(2)
renvoie l'adresse de la socket distante.
getsockopt(2)
et
setsockopt(2)
servent à fixer ou lire des options du niveau socket ou protocole.
ioctl(2)
peut servir pour lire ou écrire d'autres options.
close(2)
sert à fermer une socket.
shutdown(2)
ferme un sens de communication d'une socket full-duplex connectée.
Le positionnement, ou l'utilisation de
pread(2)
et
pwrite(2)
avec un décalage non nul n'est pas possible sur les sockets
On peut faire des entrées-sorties non bloquantes
sur les sockets en fixant l'attribut
O_NONBLOCK
sur le descripteur de la socket avec
fcntl(2).
Ensuite toutes les opérations qui devraient normalement bloquer
se terminent immédiatement 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énement E/S
|
Événemt | Poll | Occurrence
|
Lecture | POLLIN |
De nouvelles données sont arrivées.
|
Lecture | POLLIN |
Une connexion est établie
(pour les sockets orientées connexion)
|
Lecture | POLLHUP |
Déconnexion du correspondant.
|
Lecture | POLLHUP |
Connexion rompue (seulement pour les protocoles orientés connexion).
Si on écrit 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
connect(2)
en attente est terminé.
|
Lect/Écrit. | POLLERR | Une erreur asynchrone s'est produite
|
Lect/Écrit. | POLLHUP |
Le correspondant à clos un sens de communication
|
Exception | POLLPRI |
Données urgentes arrivées, le signal
SIGURG
est alors envoyé.
|
Une alternative à l'utilisation de
poll(2)
et
select(2)
est de laisser le noyau informer l'application à propos des
événements par l'intermédiaire d'un signal
SIGIO.
Pour cela l'attribut
O_ASYNC
doit être placé sur le descripteur de la socket
via
fcntl(2)
et un gestionnaire de signal pour
SIGIO
doit être installé avec
sigaction(2).
Voir les remarques sur les
Signaux
plus bas.
Options des sockets
Ces options communes à toutes les sockets
peuvent être écrites en utilisant
setsockopt(2)
et lues avec
getsockopt(2)
avec le niveau socket positionné sur
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 ;
la valeur 1 indique que la socket accepte les connexions.
Peut seulement être
lu avec
getsockopt(2).
- SO_BINDTODEVICE
-
Attacher cette socket à un périphérique donné, tel lqeth0rq,
comme indiqué dans le nom d'interface transmis.
Si le nom est une chaîne vide ou si la longueur d'option est nulle,
l'attachement de la socket au périphérique est supprimé.
L'option transmise est une chaîne terminée par un octet nul,
contenant le nom de l'interface, la longueur maximale étant
IFNAMSIZ.
Si la socket est attachée à une interface, seuls les paquets reçus
sur cette interface particulière sont traités par la socket.
Remarquez que cela ne fonctionne que pour certains types de sockets,
en particulier les sockets
AF_INET.
Ceci n'est pas supporté pour les sockets packet (utilisez un
bind(8)
normal dessus).
- SO_BROADCAST
-
Définir ou lire l'attribut broadcast.
Lorsqu'il est actif, une socket datagramme reçoit les paquets envoyés
à l'adresse broadcast et peut envoyer des paquets à une adresse broadcast.
Cette option n'a aucun effet sur les sockets de type
SOCK_STREAM.
- SO_BSDCOMPAT
-
Valider une compatibilité bogue-à-bogue avec BSD.
Cela n'est pris en compte que par le module du protocole UDP
Linux 2.0 et 2.2.
Dans ce mode, les erreurs ICMP reçues pour une socket UDP ne seront pas
transmises aux programmes utilisateurs.
Dans les versions ultérieures du noyau, le support de cette option a été
supprimé : Linux 2.4 l'ignore silencieusement et Linux 2.6 génère un
avertissement noyau (printk()) si un programme utilise cette option.
Linux 2.0 validait aussi une compatibilité bogue-à-bogue avec BSD
pour les sockets raw avec cette option,
mais cela a été éliminé dans Linux 2.2.
- SO_DEBUG
-
Activer le débogage sur la socket.
Seulement autorisé pour les processus avec la capacité
CAP_NET_ADMIN
ou un UID effectif nul.
- SO_ERROR
-
Lire et effacer l'erreur en attente sur la socket.
Uniquement valide pour
getsockopt(2).
Renvoie 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.
Il s'agit d'un attribut booléen entier.
- SO_KEEPALIVE
-
Valide l'émission de messages périodiques gardant la socket ouverte pour
les sockets orientées connexion.
Il s'agit d'un attribut booléen entier.
- SO_LINGER
-
Fixer ou lire l'option
SO_LINGER.
L'argument est une
structure
linger.
-
struct linger {
int l_onoff; /* actif */
int l_linger; /* délai maximal */
};
-
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 soit écoulé.
Sinon, l'appel revient immédiatement et la fermeture
est effectuée à l'arrière-plan.
Lorsque la socket est fermée lors d'un
exit(3),
elle se vide toujours à l'arrière-plan.
- SO_OOBINLINE
-
Si cette option est activée, les données hors-bande sont placées
directement dans le flux de données reçues.
Sinon elles ne sont transmises que si
l'attribut
MSG_OOB
est demandé durant la réception.
- SO_PASSCRED
-
Autorise ou interdit la réception des messages de contrôle
SCM_CREDENTIALS.
Pour plus de détails, voir
unix(7).
- SO_PEERCRED
-
Renvoie les authentifications du processus connecté
à l'autre extrémité de la socket.
Ce n'est possible que pour les sockets flux
PF_UNIX
connectés et les paires de sockets datagramme et flux
PF_UNIX
créés avec
socketpair(2) ;
voir
unix(7).
Les références renvoyées sont celles qui avaient cours au moment
de l'appel à
connect(2)
ou
socketpair(2).
L'argument est une structure
ucred.
Seulement valide 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és 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 pour les paquets sortants.
Établir une priorité en dehors de l'intervalle 0 à 6 nécessite la capacité
CAP_NET_ADMIN.
- SO_RCVBUF
-
Fixer ou lire la taille maximale en octets du tampon de réception.
Le noyau double cette valeur (pour donner de l'espace à un entête
de service) lorsqu'elle est configurée avec
setsockopt(2),
et cette valeur doublée est renvoyée par
getsockopt(2).
La valeur par défaut est fixée par le sysctl
rmem_default
et la valeur maximale autorisée est fixée par le
sysctl
rmem_max.
La valeur minimum (doublée) de cette option est 256.
- SO_RCVBUFFORCE (depuis Linux 2.6.14)
-
Avec cette option de socket, un processus privilégié
(CAP_NET_ADMIN)
effectue la même tâche qu'avec
SO_RCVBUF,
sauf que la limite
rmem_max
peut être écrasée.
- SO_RCVLOWAT et SO_SNDLOWAT
-
Indiquent 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 sous Linux
(setsockopt(2)
échoue avec l'erreur
ENOPROTOOPT).
SO_RCVLOWAT
n'est modifiable que depuis Linux 2.4.
Les appels système
select(2)
et
poll(2)
ne respectent pas actuellement le réglage
SO_RCVLOWAT
sous Linux,
et marque une socket comme lisible même lorsqu'un seul octet
de donnée est disponible.
Une lecture suivante sur la socket bloquera jusqu'à ce que
SO_RCVLOWAT
octets soient disponibles.
- SO_RCVTIMEO et SO_SNDTIMEO
-
Indiquent le délai maximal d'émission ou de réception avant de renvoyer
une erreur.
Le paramètre est une structure
struct timeval.
Si une fonction d'entrée ou de sortie bloque pendant cet intervalle
de temps et qu'une donnée a été envoyée ou reçue, la valeur de retour
de cette fonction sera le nombre de données transmises ;
si aucune donnée n'a été transmise et que le délai d'attente est atteint,
-1 est renvoyé et
errno
est remplie avec
EAGAIN
ou
EWOULDBLOCK
comme si la socket avait été spécifiée comme non bloquante.
Si le délai d'attente est défini à zéro (la valeur par défaut),
l'opération ne sera jamais interrompue (Ndt : elle devient bloquante).
Les délais d'attente n'ont d'effet que pour les appels systèmes
qui effectuent des entrées-sorties socket (par exemple,
read(2),
recvmsg(2),
send(2),
sendmsg(2)) ;
ils n'ont aucun effet avec
select(2),
poll(2),
epoll_wait(2),
etc.
- SO_REUSEADDR
-
Indique que les règles permettant la validation des adresses fournies
dans un appel
bind(2)
doivent autoriser la réutilisation des adresses locales.
Pour les sockets
PF_INET
cela signifie que la socket peut s'attacher à n'importe quelle adresse
sauf s'il y a une attente active dessus.
Lorsque la socket en attente est attachée à
INADDR_ANY
avec un port spécifique, il n'est pas possible de s'attacher à nouveau
à ce port quelque soit l'adresse locale.
L'argument est un attribut booléen entier.
- SO_SNDBUF
-
Fixer ou lire la taille maximale en octets du tampon d'émission.
Le noyau double cette valeur (pour donner de l'espace à un entête
de service) lorsqu'elle est configurée avec
setsockopt(2),
et cette valeur doublée est renvoyée par
getsockopt(2).
La valeur par défaut est fixée par le sysctl
wmem_default
et la valeur maximale autorisée est fixée par le
sysctl
wmem_max.
La valeur minimum (doublée) de cette option est 2048.
- SO_SNDBUFFORCE (depuis Linux 2.6.14)
-
Avec cette option socket, un processus privilégié
(CAP_NET_ADMIN)
peut effectuer la même tâche qu'avec
SO_SNDBUF,
sauf que la limite
wmem_max
peut être écrasée.
- SO_TIMESTAMP
-
Active ou désactive la réception du message 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
struct timeval
indiquant l'heure de réception du dernier paquet passé
à l'utilisateur dans cet appel.
Voir
cmsg(3)
pour les détails sur les messages de contrôle.
- SO_TYPE
-
Obtenir le type de socket, sous forme d'entier (comme
SOCK_STREAM).
Ne peut qu'être
lu avec
getsockopt(2).
Signaux
Lorsqu'on écrit sur une socket orientée connexion qui a été fermée
(localement ou à l'autre extrémité) le signal
SIGPIPE
est envoyé au processus écrivain, et
EPIPE
est renvoyé.
Le signal n'est pas envoyé lorsque l'appel d'écriture
contenait l'attribut
MSG_NOSIGNAL.
Lorsqu'on le demande avec l'option
FIOSETOWN
de
fcntl(2)
ou l'option
SIOCSPGRP
de
ioctl(2),
le signal
SIGIO
est envoyée quand un événement d'entrée-sortie se produit.
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 demander
un signal temps réel avec le
fnctl(2)
F_SETSIG.
Le gestionnaire du signal temps réel sera invoqué
avec le descripteur de fichier dans le champ
si_fd
de
siginfo_t.
Voir
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
SIGIO
peut avoir disparu quand le processus réagit au signal.
Si cela se produit, le processus doit attendre à nouveau car Linux
lui renverra le signal ultérieurement.
Sysctls
Les sysctls réseau des sockets de base sont accessibles avec les fichiers
/proc/sys/net/core/*
ou avec
l'interface
sysctl(2).
- 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 réclamer avec l'option
SO_RCVBUF
de la socket.
- wmem_default
-
contient la taille en octets par défaut du tampon d'émission.
- wmem_max
-
contient la taille maximale en octets du tampon d'émission
qu'un utilisateur peut réclamer 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
-
Nombre maximal de paquets dans la file d'entrée globale.
- optmem_max
-
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, ioctl_type, &value_result);
- SIOCGSTAMP
-
Renvoie une structure
struct timeval
avec l'horodatage de réception du dernier paquet transmis à l'utilisateur.
Ceci permet des mesures précises de circulation sur le réseau.
Voir
setitimer(2)
pour le détail de la
struct timeval.
Cet ioctl ne devrait être utilisé que si l'option socket
SO_TIMESTAMP
n'est pas positionnée pour la socket.
Autrement, il renvoie l'horodatage du dernier paquet reçu lorsque
SO_TIMESTAMP
n'était pas positionné, ou il échoue si un tel paquet n'a pas été reçu
(c'est-à-dire
ioctl(2)
renvoie -1 avec
errno
contenant
ENOENT).
- SIOCSPGRP
-
Fixer le processus ou le groupe de processus auquel envoyer les signaux
SIGIO
ou
SIGURG
lorsqu'une
opération d'entrée-sortie
asynchrone s'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, on envoie le signal à ce processus.
S'il est négatif on l'envoie au groupe de processus dont l'identifiant
correspond à la valeur absolue de l'argument.
Un processus ne peut demande que l'émission vers lui-même ou son propre
groupe, à moins qu'il ait la capacité
CAP_KILL
ou un UID effectif nul.
- FIOASYNC
-
Changer l'attribut
O_ASYNC
pour activer ou désactiver le mode d'entrée-sortie asynchrone
sur la socket.
Le mode d'entrées-sorties asynchrones signifie que le signal
SIGIO
ou le signal fixé avec
F_SETSIG
est envoyé quand un événement d'entrée-sortie se produit.
-
L'argument est un attribut booléen entier.
(Cette opération est synonyme de l'utilisation de
fcntl(2)
pour définir l'attribut
O_ASYNC.)
- SIOCGPGRP
-
Lire le processus ou le groupe de processus auquel les signaux
SIGIO
ou
SIGURG
sont envoyés,
ou zéro
si aucun n'est configuré.
Opérations
fcntl(2)
valides :
- FIOGETOWN
-
Comme
l'ioctl(2)
SIOCGPGRP.
- FIOSETOWN
-
Comme
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 sysctls sont nouveaux dans Linux 2.2.
SO_RCVTIMEO
et
SO_SNDTIMEO
sont supportées depuis Linux 2.3.41.
Précédemment, les délais d'attente étaient fixés 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 sysctls sont deux fois plus grand
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 cette option sera positionnée à la fois
par le précedent programme qui a effectué un
bind(2)
sur le port et par le programme qui veut réutiliser le port.
Ceci est différent sur certaines implémentations (par exemple, FreeBSD)
où seul le dernier programme doit positionner l'option
SO_REUSEADDR.
Typiquement, cette différence est invisible depuis que, par exemple,
un programme serveur est conçu pour toujours positionner cette option.
BOGUES
Les options de socket
CONFIG_FILTER
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),
TRADUCTION
Ce document est une traduction réalisée par Christophe Blaess
<http://www.blaess.fr/christophe/> le 11 juin 2001, mise à jour par
Alain Portal <aportal AT univ-montp2 DOT fr> le 4juillet 2005
et révisée le 17 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation
française de qualité. La version anglaise la plus à jour de ce document est
toujours consultable via la commande : « LANG=C man 7 socket ».
N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute
erreur dans cette page de manuel.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- Fonctions de la couche socket
-
- Options des sockets
-
- Signaux
-
- Sysctls
-
- Ioctls
-
- VERSIONS
-
- NOTES
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 17 juillet 2008