Man page - socket(7)

Packages contains this manual

Available languages:

en fr ja ru zh_TW zh_CN

Manual

socket

NOM
SYNOPSIS
DESCRIPTION
Fonctions du niveau socket
Structures d’adresses de socket
Options de socket
Signaux
/proc interfaces
Ioctls
VERSIONS
NOTES
VOIR AUSSI
TRADUCTION

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 tels que AF_INET , AF_IPX et 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 un socket, connect (2) connecte un socket Ă  une adresse de socket distant, la fonction bind (2) attache un socket Ă  une adresse locale, listen (2) indique au socket que de nouvelles connexions doivent ĂȘtre acceptĂ©es et accept (2) est utilisĂ© pour obtenir un nouveau socket avec une nouvelle connexion entrante. socketpair (2) renvoie deux sockets anonymes connectĂ©s (seulement implĂ©mentĂ©e pour quelques familles locales comme AF_UNIX ).

send (2), sendto (2) et sendmsg (2) envoient des donnĂ©es sur un socket, et recv (2), recvfrom (2) et recvmsg (2) reçoivent les donnĂ©es d’un 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 du socket local et getpeername (2) renvoie l’adresse du socket distant. getsockopt (2) et setsockopt (2) servent Ă  dĂ©finir et Ă  obtenir les options de la couche socket ou du protocole. ioctl (2) peut ĂȘtre utilisĂ©e pour lire et Ă©crire d’autres options.

close (2) sert Ă  fermer un socket. shutdown (2) ferme une partie des connexions d’un duplex intĂ©gral de socket.

La recherche ou l’utilisation de pread (2) ou pwrite (2) avec une position diffĂ©rente de zĂ©ro 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 fichier du 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).

Image grohtml-3848987-1.png

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 du socket Ă  l’aide de fcntl (2) et un gestionnaire de signal valable pour SIGIO doit ĂȘtre installĂ© avec sigaction (2). Consultez les remarques sur les Signaux ci-dessous.

Structures d’adresses de socket

Chaque domaine de socket a son propre format pour les adresses de socket, avec une structure d’adresse propre. Chacune de ces structures commence par un champ d’entier « family » (famille), de type sa_family_t , qui indique le type de structure d’adresse. Cela permet aux appels systĂšme gĂ©nĂ©riques Ă  tous les domaines de socket (par exemple connect (2), bind (2), accept (2), getsockname (2), getpeername (2)) de dĂ©terminer le domaine d’une adresse de socket donnĂ©e.

Le type struct sockaddr est dĂ©fini afin de pouvoir passer n’importe quel type d’adresse de socket aux interfaces dans l’API des sockets. Le but de ce type est purement d’autoriser la conversion de types d’adresse de socket propres Ă  un domaine vers le type « gĂ©nĂ©rique », afin d’éviter les avertissements du compilateur au sujet de la non correspondance de type dans les appels de l’API des sockets.

De plus, l’API des sockets fournit le type de donnĂ©es struct sockaddr_storage . Ce type est fait pour contenir toute structure d’adresse de socket spĂ©cifique Ă  un domaine. Il est suffisamment grand et est alignĂ© correctement (en particulier, il est assez grand pour contenir des adresses de socket IPv6). Cette structure contient le champ suivant, qui peut ĂȘtre utilisĂ© pour identifier le type d’adresse de socket effectivement stockĂ©e dans la structure :

sa_family_t ss_family;

La structure sockaddr_storage est utile dans les programmes qui doivent prendre en charge les adresses de socket de maniÚre générique (par exemple les programmes qui doivent gérer à la fois des adresses de socket IPv4 et IPv6).

Options de socket

Les options de socket prĂ©sentĂ©es ci-dessous peuvent ĂȘtre dĂ©finies en utilisant setsockopt (2) et lues avec getsockopt (2) avec le niveau de socket positionnĂ© Ă  SOL_SOCKET pour tous les sockets. Sauf mention contraire, optval est un pointeur vers un int .
SO_ACCEPTCONN

Renvoyer une valeur indiquant si le socket a Ă©tĂ© dĂ©clarĂ© comme acceptant ou non les connexions Ă  l’aide de listen (2). La valeur 0 indique que le socket n’est pas Ă  l’écoute et la valeur 1 indique que le socket l’est. Cette option de socket peut ĂȘtre seulement lue.

SO_ATTACH_FILTER (depuis Linux 2.2)
SO_ATTACH_BPF
(depuis Linux 3.19)

Attacher un programme BPF classique ( SO_ATTACH_FILTER ) ou un programme BPF étendu ( SO_ATTACH_BPF ) au socket pour une utilisation comme filtre dans les paquets entrants. Un paquet sera abandonné si le programme de filtrage renvoie zéro. Si le programme de filtrage renvoie une valeur différente de zéro qui est moindre que la taille des données du paquet, celui-ci sera tronqué à la taille renvoyée. Si la valeur renvoyée par le filtre est supérieure ou égale à la taille des données du paquet, le paquet est autorisé à continuer non modifié.

L’argument pour SO_ATTACH_FILTER est une structure sock_fprog , dĂ©finie dans <linux/filter.h> :

struct sock_fprog {
unsigned short len;
struct sock_filter *filter;
};

L’argument pour SO_ATTACH_BPF est un descripteur de fichier renvoyĂ© par l’appel systĂšme bpf (2) et doit rĂ©fĂ©rer Ă  un programme de type BPF_PROG_TYPE_SOCKET_FILTER .

Ces options peuvent ĂȘtre dĂ©finies plusieurs fois pour un socket donnĂ©, remplaçant Ă  chaque fois le programme de filtre prĂ©cĂ©dent. Les versions classiques et Ă©tendues peuvent ĂȘtre appelĂ©es sur le mĂȘme socket, mais le filtre prĂ©cĂ©dent sera toujours remplacĂ© de telle façon qu’un socket n’aura jamais plus d’un filtre dĂ©fini.

Les versions BPF classique et étendue sont expliquées dans le fichier source du noyau, Documentation/networking/filter.txt

SO_ATTACH_REUSEPORT_CBPF
SO_ATTACH_REUSEPORT_EBPF

Pour une utilisation avec l’option SO_REUSEPORT , ces options permettent Ă  l’utilisateur de dĂ©finir un programme BPF classique ( SO_ATTACH_REUSEPORT_CBPF ) ou Ă©tendu ( SO_ATTACH_REUSEPORT_EBPF ) qui prĂ©cise comment les paquets sont assignĂ©s aux sockets dans le groupe de rĂ©utilisation de port (c’est-Ă -dire tous les sockets qui ont SO_REUSEPORT activĂ© et qui utilisent la mĂȘme adresse locale pour recevoir des paquets).

Le programme BPF doit renvoyer un indice entre 0 et N-1 reprĂ©sentant le socket qui doit recevoir le paquet (oĂč N est le nombre de sockets dans le groupe). Si le programme BPF renvoie un indice non valable, la sĂ©lection du socket reviendra au mĂ©canisme strict SO_REUSEPORT .

Les sockets sont numĂ©rotĂ©s dans l’ordre dont ils sont ajoutĂ©s dans le groupe (c’est-Ă -dire l’ordre des appels bind (2) pour les sockets UDP ou l’ordre des appels listen (2) pour les sockets TCP). Les nouveaux sockets ajoutĂ©s Ă  un groupe de rĂ©utilisation de port hĂ©riteront du programme BPF. Quand un socket est supprimĂ© d’un groupe de rĂ©utilisation (Ă  l’aide de close (2)), le dernier socket sera dĂ©placĂ© dans la position du socket fermĂ©.

Ces options peuvent ĂȘtre dĂ©finies Ă  plusieurs reprises n’importe quand sur n’importe quel socket dans le groupe pour remplacer le programme BPF en cours utilisĂ© par tous les sockets du groupe.

SO_ATTACH_REUSEPORT_CBPF prend le mĂȘme type d’argument que SO_ATTACH_FILTER et SO_ATTACH_REUSEPORT_EBPF prend le mĂȘme argument type que SO_ATTACH_BPF .

La prise en charge d’UDP pour cette fonctionnalitĂ© est disponible depuis Linux 4.5. La prise en charge de TCP est disponible depuis Linux 4.6.

SO_BINDTODEVICE

Attacher ce 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, le socket est dĂ©tachĂ© du pĂ©riphĂ©rique. L’option transmise est une chaĂźne de longueur variable terminĂ©e par un octet NULL, contenant le nom de l’interface, la longueur maximale Ă©tant IFNAMSIZ . Si un socket est attachĂ© Ă  une interface, seuls les paquets reçus de cette interface particuliĂšre sont traitĂ©s par le socket. Cela ne fonctionne que pour certains types de socket, en particulier les sockets AF_INET . Cela n’est pas gĂ©rĂ© pour les sockets paquet (utilisez pour cela bind (2)).

Avant Linux 3.8, cette option de socket pouvait ĂȘtre configurĂ©e, sans pouvoir ĂȘtre lue par getsockopt (2). Depuis Linux 3.8, elle est lisible. Le paramĂštre optlen doit contenir la taille du tampon destinĂ© Ă  recevoir le nom du pĂ©riphĂ©rique et il est recommandĂ© d’ĂȘtre de IFNAMSZ octets. La vĂ©ritable longueur du nom du pĂ©riphĂ©rique est renvoyĂ©e dans le paramĂštre optlen .

SO_BROADCAST

DĂ©finir ou lire l’attribut de diffusion. Une fois activĂ©, les sockets de datagrammes sont autorisĂ©s Ă  envoyer des paquets Ă  une adresse de diffusion. Cette option n’a aucun effet sur les sockets orientĂ©s flux.

SO_BSDCOMPAT

Activer 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 un 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 bruts ayant cette option, mais cela a Ă©tĂ© Ă©liminĂ© dans Linux 2.2.

SO_DEBUG

Activer le dĂ©bogage de socket. Cela n’est autorisĂ© que pour les processus ayant la capacitĂ© CAP_NET_ADMIN ou un identifiant d’utilisateur effectif Ă©gal à 0.

SO_DETACH_FILTER (depuis Linux 2.2)
SO_DETACH_BPF
(depuis Linux 3.19)

Ces deux options, qui sont synonymes, peuvent ĂȘtre utilisĂ©es pour retirer le programme BPF classique ou Ă©tendu attachĂ© Ă  un socket avec soit SO_ATTACH_FILTER soit SO_ATTACH_BPF . La valeur d’option est ignorĂ©e.

SO_DOMAIN (depuis Linux 2.6.32)

RĂ©cupĂ©rer le domaine de socket sous forme d’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.

SO_ERROR

Lire et effacer l’erreur en cours sur le socket. Cette option de socket peut ĂȘtre seulement lue. Un entier est attendu.

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 le socket. Un attribut entier boolĂ©en est attendu.

SO_INCOMING_CPU (récupérable depuis Linux 3.19, modifiable depuis Linux
4.4)

DĂ©finir ou obtenir l’affinitĂ© CPU d’un socket. Un attribut entier est attendu.

int cpu = 1;
setsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, &cpu,
sizeof(cpu));

Parce que tous les paquets d’un flux unique (c’est-Ă -dire tous les paquets pour le mĂȘme 4-tuple) arrivent sur une file d’attente RX unique qui est associĂ©e avec un CPU particulier, le cas d’utilisation classique est d’employer un processus d’écoute par file RX, avec le flux entrant gĂ©rĂ© par un Ă©couteur sur le mĂȘme CPU gĂ©rant la file RX. Cela fournit un comportement NUMA optimal et conserve les caches de CPU prĂȘts.

SO_INCOMING_NAPI_ID (récupérable depuis Linux 4.12)

Renvoyer un ID unique au niveau systÚme, appelé ID NAPI qui est associé avec une file RX dans laquelle le dernier paquet associé à ce socket est reçu.

Cela peut ĂȘtre utilisĂ© par une application qui sĂ©pare les flux entrants entre les threads d’exĂ©cution (worker) en se basant sur la file RX sur laquelle les paquets associĂ©s avec les flux sont reçus. Cela permet Ă  chaque thread d’exĂ©cution d’ĂȘtre associĂ© Ă  une file de rĂ©ception HW de NIC et de servir toutes les requĂȘtes de connexion reçues sur cette file RX. Ce mappage entre un thread d’application et une file HW de NIC rationalise le flux de donnĂ©es du NIC vers l’application.

SO_KEEPALIVE

Activer l’émission de messages pĂ©riodiques gardant le socket ouvert pour les sockets orientĂ©s connexion. Un attribut entier boolĂ©en est attendu.

SO_LINGER

DĂ©finir ou lire l’option SO_LINGER . L’argument est une structure linger .

struct linger {
int l_onoff; /* attente activée */
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 le 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 le socket est fermĂ© au cours d’un exit (2), il attend toujours en arriĂšre-plan.

SO_LOCK_FILTER

Lorsqu’elle est Ă©tablie cette option empĂȘchera la modification des filtres associĂ©s au socket. Ces filtres incluent tous les ensembles issus des options de socket SO_ATTACH_FILTER , SO_ATTACH_BPF , SO_ATTACH_REUSEPORT_CBPF et SO_ATTACH_REUSEPORT_EBPF .

Le cas d’utilisation typique est celui d’un processus privilĂ©giĂ© pour dĂ©finir un socket brut (une opĂ©ration nĂ©cessitant la capacitĂ© CAP_NET_RAW ), appliquer un filtre restrictif, rĂ©gler l’option SO_LOCK_FILTER et alors soit abandonner ses privilĂšges soit passer le descripteur de fichier du socket Ă  un processus non privilĂ©giĂ© Ă  l’aide d’un socket de domaine UNIX.

Une fois que l’option SO_LOCK_FILTER a Ă©tĂ© activĂ©e, essayer de modifier ou de supprimer le filtre attachĂ© Ă  un socket, ou dĂ©sactiver l’option SO_LOCK_FILTER Ă©chouera avec l’erreur EPERM .

SO_MARK (depuis Linux 2.6.25)

Positionner la marque pour chaque paquet envoyĂ© au travers de ce 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 ou CAP_NET_RAW (depuis Linux 5.17).

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

Autoriser ou interdire la réception des messages de contrÎle SCM_CREDENTIALS . Pour plus de détails, consultez unix (7).

SO_PASSSEC

Autoriser ou interdire la réception des messages de contrÎle SCM_SECURITY . Pour plus de détails, consultez unix (7).

SO_PEEK_OFF (depuis Linux 3.4)

Cette option, qui n’est Ă  ce jour prise en charge que pour les sockets unix (7), dĂ©finit la valeur de la premiĂšre « position de lecture » (« peek offset ») pour l’appel systĂšme recv (2) lorsqu’il est invoquĂ© avec l’attribut MSG_PEEK .

Lorsque cette option reçoit une valeur nĂ©gative (elle est initialisĂ©e Ă  -1 pour tout nouveau socket), elle se comporte classiquement : recv (2), avec l’attribut MSG_PEEK , lit les donnĂ©es au dĂ©but de la file.

Lorsque l’option reçoit une valeur supĂ©rieure ou Ă©gale Ă  zĂ©ro, alors la lecture suivante des donnĂ©es en file d’attente dans le socket est rĂ©alisĂ©e Ă  la position prĂ©cisĂ©e par la valeur de l’option. Dans le mĂȘme temps, la « position de lecture » est incrĂ©mentĂ©e du nombre d’octets lus dans la file, de façon Ă  ce que la prochaine lecture renvoie la donnĂ©e suivante dans la file.

Si des donnĂ©es sont retirĂ©es de la tĂȘte de la file par la fonction recv (2) (ou Ă©quivalent) sans l’attribut MSG_PEEK , alors la « position de lecture » est diminuĂ©e du nombre d’octets supprimĂ©s. Autrement dit, l’acquisition de donnĂ©es sans avoir recours Ă  l’attribut MSG_PEEK a pour effet de modifier la « position de lecture », de sorte que la prochaine lecture renvoie les donnĂ©es qui auraient Ă©tĂ© renvoyĂ©es si aucune donnĂ©e n’avait Ă©tĂ© supprimĂ©e.

Pour les sockets de datagrammes, si la « position de lecture » pointe Ă  l’intĂ©rieur d’un paquet, alors les donnĂ©es renvoyĂ©es seront marquĂ©es avec l’attribut MSG_TRUNC .

L’exemple suivant illustre l’usage de SO_PEEK_OFF . Imaginons un socket de flux contenant les donnĂ©es suivantes dans sa file :

aabbccddeeff

La sĂ©quence suivante d’appels Ă  recv (2) aura l’effet dĂ©crit dans les commentaires :

int ov = 4; // réglage à 4 de la position de lecture
setsockopt(fd, SOL_SOCKET, SO_PEEK_OFF, &ov, sizeof(ov));
recv(fd, buf, 2, MSG_PEEK); // Lit "cc"; position réglée à 6
recv(fd, buf, 2, MSG_PEEK); // Lit "dd"; position réglée à 8
recv(fd, buf, 2, 0); // Lit "aa"; position réglée à 6
recv(fd, buf, 2, MSG_PEEK); // Lit "ee"; position réglée à 8

SO_PEERCRED

Renvoyer les accréditations du processus pair connecté à ce socket. Pour plus de détails, consultez unix (7).

SO_PEERSEC (depuis Linux 2.6.2)

Renvoyer le contexte de sécurité du socket pair connecté à ce socket. Pour plus de détails, consultez unix (7) et ip (7).

SO_PRIORITY

DĂ©finir la prioritĂ© dĂ©finie par le protocole pour tous les paquets envoyĂ©s sur ce 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 sĂ©lectionnĂ©. É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Ă©rer le protocole de socket sous forme d’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Ă©finir ou lire 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

Indiquer 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 sur Linux ( setsockopt (2) Ă©choue avec l’erreur ENOPROTOOPT ). SO_RCVLOWAT est modifiable seulement depuis Linux 2.4.

Avant Linux 2.6.28, select (2), poll (2) et epoll (7) ne respectaient pas le rĂ©glage SO_RCVLOWAT sur Linux et indiquaient un socket comme lisible mĂȘme si un seul octet Ă©tait disponible. Une prochaine lecture du socket bloquerait alors jusqu’à ce que SO_RCVLOWAT octets soient disponibles. Depuis Linux 2.6.28, select (2), poll (2) et epoll (7) indiquent qu’un socket est lisible uniquement si au moins SO_RCVLOWAT octets sont 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Ă© Ă  EAGAIN ou EWOULDBLOCK , ou EINPROGRESS (pour connect (2)), comme si le socket avait Ă©tĂ© dĂ©fini comme non bloquant. 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 accept (2), connect (2), 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

Indiquer 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 le socket peut ĂȘtre attachĂ© Ă  n’importe quelle adresse sauf lorsqu’un socket actif en Ă©coute y est liĂ©e. Lorsque le socket en Ă©coute est attachĂ© Ă  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_REUSEPORT (depuis Linux 3.9)

Autoriser plusieurs sockets AF_INET ou AF_INET6 Ă  ĂȘtre liĂ©s Ă  une adresse identique de socket. Cette option doit ĂȘtre dĂ©clarĂ©e sur chaque socket (y compris le premier socket) avant d’appeler bind (2) sur le socket. Pour prĂ©venir le dĂ©tournement de port, tous les processus reliĂ©s Ă  la mĂȘme adresse doivent avoir le mĂȘme UID effectif. Cette option peut ĂȘtre employĂ©e avec les sockets TCP et UDP.

Pour les sockets TCP, cette option autorise la rĂ©partition des charges accept (2) dans un serveur multithread pour ĂȘtre renforcĂ©e en utilisant un socket d’écoute pour chaque thread. Cela amĂ©liore la rĂ©partition des charges par rapport aux techniques traditionnelles telles qu’un unique thread accept (2)ant qui rĂ©partit les connexions ou d’avoir plusieurs threads qui rivalisent pour accept (2) Ă  partir du mĂȘme socket.

Pour les sockets UDP, l’utilisation de cette option peut procurer une meilleure rĂ©partition des datagrammes entrants vers plusieurs processus (ou threads) par rapport aux techniques traditionnelles d’avoir plusieurs processus rivalisant pour recevoir des datagrammes sur le mĂȘme socket.

SO_RXQ_OVFL (depuis Linux 2.6.33)

Indiquer qu’un message auxiliaire (cmsg) sous la forme d’une valeur non signĂ©e et codĂ©e sur 32 bits doit ĂȘtre joint aux tampons de socket (skb — socket buffer), indiquant le nombre de paquets perdus par le socket depuis sa crĂ©ation.

SO_SELECT_ERR_QUEUE (depuis Linux 3.10)

Quand cette option est activĂ©e sur un socket, une condition d’erreur sur un socket entraĂźne une notification pas seulement Ă  l’aide de l’ensemble exceptfds de select (2). De la mĂȘme façon, poll (2) renvoie aussi POLLPRI a chaque fois qu’un Ă©vĂšnement POLLERR est renvoyĂ©.

Contexte : cette option a Ă©tĂ© ajoutĂ©e depuis que le rĂ©veil sur une condition d’erreur se produisait seulement au travers des ensembles readfds et writefds de select (2). Cette option a Ă©tĂ© ajoutĂ©e pour permettre la supervision des conditions d’erreur Ă  l’aide de l’argument exceptfds sans avoir simultanĂ©ment Ă  recevoir des notifications (Ă  l’aide de readfds ) pour des donnĂ©es rĂ©guliĂšres pouvant ĂȘtre lues Ă  partir du socket. AprĂšs les changements dans Linux 4.16, l’utilisation de cet indicateur n’est plus nĂ©cessaire. Cette option est nĂ©anmoins conservĂ©e pour la rĂ©trocompatibilitĂ©.

SO_SNDBUF

DĂ©finir ou lire 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

Activer ou dĂ©sactiver 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 un cmsg_type de SCM_TIMESTAMP . 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_TIMESTAMPNS (depuis Linux 2.6.22)

Activer ou dĂ©sactiver la rĂ©ception des messages de contrĂŽle SO_TIMESTAMPNS . Le message de contrĂŽle d’horodatage est envoyĂ© avec le niveau SOL_SOCKET et un cmsg_type de SCM_TIMESTAMPNS . Le champ cmsg_data est une structure timespec indiquant la date de rĂ©ception du dernier paquet fourni Ă  l’utilisateur dans cet appel. L’horloge utilisĂ©e pour l’horodatage est CLOCK_REALTIME . Consultez cmsg (3) pour plus de dĂ©tails sur les messages de contrĂŽle.

Un socket ne peut pas mélanger SO_TIMESTAMP et SO_TIMESTAMPNS , les deux modes sont mutuellement exclusifs.

SO_TYPE

Lire le type de socket, sous forme d’entier (par exemple, SOCK_STREAM ). Cette option de socket peut ĂȘtre seulement lue, et pas modifiĂ©e.

SO_BUSY_POLL (depuis Linux 3.11)

DĂ©finir la durĂ©e approximative, en milliseconde, d’attente active de rĂ©ception bloquante en absence de donnĂ©es. CAP_NET_ADMIN est nĂ©cessaire pour augmenter cette valeur. La valeur par dĂ©faut pour cette option est contrĂŽlĂ©e par le fichier /proc/sys/net/core/busy_read .

La valeur dans le fichier /proc/sys/net/core/busy_poll dĂ©termine la durĂ©e pendant laquelle select (2) et poll (2) seront en attente active lors d’une opĂ©ration sur des sockets avec SO_BUSY_POLL dĂ©fini et qu’aucun Ă©vĂ©nement Ă  signaler n’est trouvĂ©.

Dans les deux cas, l’attente active ne sera rĂ©alisĂ©e que lorsque les derniĂšres donnĂ©es reçues par le socket proviennent d’un pĂ©riphĂ©rique rĂ©seau qui prend en charge cette option.

Bien que l’attente active peut amĂ©liorer la latence de quelques applications, une attention particuliĂšre doit ĂȘtre portĂ©e Ă  son utilisation puisque cela augmentera Ă  la fois l’utilisation du processeur et la consommation de puissance.

Signaux

Lors de l’écriture sur un socket orientĂ© connexion qui a Ă©tĂ© fermĂ© (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 quel 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 son siginfo_t . Consultez fcntl (2) pour plus d’informations.

Dans certains cas (par exemple, diffĂ©rents processus accĂ©dant au 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.

/proc interfaces

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 du socket.

rmem_max

contient la taille maximale en octets du tampon de rĂ©ception qu’un utilisateur peut dĂ©finir avec l’option SO_RCVBUF du socket.

wmem_default

contient la taille en octets par dĂ©faut du tampon d’émission du socket.

wmem_max

contient la taille maximale en octets du tampon d’émission qu’un utilisateur peut dĂ©finir avec l’option SO_SNDBUF du socket.

message_cost et message_burst

configurent le filtrage par seau Ă  jetons (token bucket) 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 auxiliaires et des données de contrÎle utilisateur comme les « iovec ».

Ioctls

Ces opérations sont accessibles en utilisant ioctl (2) :

error = ioctl( ip_socket , type_ioctl , &valeur_résultat );

SIOCGSTAMP

Renvoyer 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 les options SO_TIMESTAMP et SO_TIMESTAMPNS du socket ne sont pas dĂ©finies. Sinon, la date du dernier paquet reçu quand SO_TIMESTAMP et SO_TIMESTAMPNS n’étaient pas dĂ©finies est renvoyĂ©e, ou un Ă©chec est constatĂ© si de tels paquets ne sont pas reçus (c’est-Ă -dire que ioctl (2) renvoie -1 avec un errno dĂ©fini Ă  ENOENT ).

SIOCSPGRP

DĂ©finir le processus ou le groupe de processus qui doivent recevoir les signaux SIGIO ou SIGURG quand les E/S deviennent possibles ou que des donnĂ©es urgentes sont disponibles. L’argument est un pointeur vers un pid_t . Pour d’autres dĂ©tails, consultez la description de F_SETOWN dans fcntl (2).

FIOASYNC

Changer l’attribut O_ASYNC pour activer ou dĂ©sactiver le mode d’entrĂ©e-sortie asynchrone du 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 entier boolĂ©en. (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 en cours 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 selon un rĂ©glage spĂ©cifique aux 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. Cela 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.

VOIR AUSSI

wireshark (1), bpf (2), connect (2), getsockopt (2), setsockopt (2), socket (2), pcap (3), address_families (7), capabilities (7), ddp (7), ip (7), ipv6 (7), packet (7), tcp (7), udp (7), unix (7), tcpdump (8)

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-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

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 à debian-l10n-french@lists.debian.org .