socket(7) Miscellaneous Information Manual socket(7) NOM socket - Interface Linux aux sockets SYNOPSIS #include sockfd = socket(int famille_socket, int type_socket, int protocole); DESCRIPTION Cette page de manuel documente l'interface utilisateur de l'implementation Linux des sockets reseau. Les sockets compatibles BSD representent l'interface uniforme entre le processus utilisateur et les piles de protocoles reseau dans le noyau. Les modules des protocoles sont regroupes 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 These functions are used by the user process to send or receive packets and to do other socket operations. For more information, see their respective manual pages. socket(2) cree un socket, connect(2) connecte un socket a une adresse de socket distant, la fonction bind(2) attache un socket a une adresse locale, listen(2) indique au socket que de nouvelles connexions doivent etre acceptees et accept(2) est utilise pour obtenir un nouveau socket avec une nouvelle connexion entrante. socketpair(2) renvoie deux sockets anonymes connectes (seulement implementee pour quelques familles locales comme AF_UNIX). send(2), sendto(2) et sendmsg(2) envoient des donnees sur un socket, et recv(2), recvfrom(2) et recvmsg(2) recoivent les donnees d'un socket. poll(2) et select(2) attendent que des donnees arrivent ou que l'emission soit possible. De plus, les operations d'entree-sortie standard comme write(2), writev(2), sendfile(2), read(2) et readv(2) peuvent etre utilisees pour la lecture et l'ecriture des donnees. getsockname(2) renvoie l'adresse du socket local et getpeername(2) renvoie l'adresse du socket distant. getsockopt(2) et setsockopt(2) servent a definir et a obtenir les options de la couche socket ou du protocole. ioctl(2) peut etre utilisee pour lire et ecrire d'autres options. close(2) sert a fermer un socket. shutdown(2) ferme une partie des connexions d'un duplex integral de socket. La recherche ou l'utilisation de pread(2) ou pwrite(2) avec une position differente de zero n'est pas possible sur les sockets. Des operations d'entree-sortie non bloquantes sur les sockets sont possibles en definissant l'attribut O_NONBLOCK du descripteur de fichier du socket avec fcntl(2). Toutes les operations qui devraient normalement bloquer se terminent alors avec l'erreur EAGAIN (l'operation devra etre retentee ulterieurement). connect(2) renverra l'erreur EINPROGRESS. L'utilisateur peut alors attendre divers evenements avec poll(2) ou select(2). +----------------------------------------------------------------------+ | Evenements E/S | +---------------+---------------------+--------------------------------+ |Evenement | Indicateur d'etat | Occurrence | +---------------+---------------------+--------------------------------+ |Lecture | POLLIN | Arrivee de nouvelles donnees. | +---------------+---------------------+--------------------------------+ |Lecture | POLLIN | Une connexion a ete realisee | | | | (pour les sockets orientes | | | | connexion) | +---------------+---------------------+--------------------------------+ |Lecture | POLLHUP | Une demande de deconnexion a | | | | ete initiee par l'autre | | | | extremite. | +---------------+---------------------+--------------------------------+ |Lecture | POLLHUP | Une connexion est rompue | | | | (seulement pour les protocoles | | | | orientes connexion). Lorsque | | | | le socket est ecrit, SIGPIPE | | | | est aussi envoye. | +---------------+---------------------+--------------------------------+ |Ecriture | POLLOUT | Le socket a assez de place | | | | dans le tampon d'emission pour | | | | ecrire de nouvelles donnees. | +---------------+---------------------+--------------------------------+ |Lect./Ecrit. | POLLIN | POLLOUT | Un connect(2) sortant a | | | | termine. | +---------------+---------------------+--------------------------------+ |Lect./Ecrit. | POLLERR | Une erreur asynchrone s'est | | | | produite. | +---------------+---------------------+--------------------------------+ |Lect./Ecrit. | POLLHUP | Le correspondant a clos un | | | | sens de communication. | +---------------+---------------------+--------------------------------+ |Exception | POLLPRI | Arrivee de donnees urgentes. | | | | SIGURG est alors envoye. | +---------------+---------------------+--------------------------------+ Une alternative a poll(2) et select(2) est de laisser le noyau informer l'application des evenements par l'intermediaire d'un signal SIGIO. Pour cela, l'attribut O_ASYNC doit etre defini sur un descripteur de fichier du socket a l'aide de fcntl(2) et un gestionnaire de signal valable pour SIGIO doit etre installe 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 systeme generiques a tous les domaines de socket (par exemple connect(2), bind(2), accept(2), getsockname(2), getpeername(2)) de determiner le domaine d'une adresse de socket donnee. Le type struct sockaddr est defini 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 a un domaine vers le type << generique >>, afin d'eviter 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 donnees struct sockaddr_storage. Ce type est fait pour contenir toute structure d'adresse de socket specifique a un domaine. Il est suffisamment grand et est aligne correctement (en particulier, il est assez grand pour contenir des adresses de socket IPv6). Cette structure contient le champ suivant, qui peut etre utilise pour identifier le type d'adresse de socket effectivement stockee 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 maniere generique (par exemple les programmes qui doivent gerer a la fois des adresses de socket IPv4 et IPv6). Options de socket Les options de socket presentees ci-dessous peuvent etre definies en utilisant setsockopt(2) et lues avec getsockopt(2) avec le niveau de socket positionne a 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 ete declare comme acceptant ou non les connexions a l'aide de listen(2). La valeur 0 indique que le socket n'est pas a l'ecoute et la valeur 1 indique que le socket l'est. Cette option de socket peut etre seulement lue. SO_ATTACH_FILTER (since Linux 2.2) SO_ATTACH_BPF (since Linux 3.19) Attacher un programme BPF classique (SO_ATTACH_FILTER) ou un programme BPF etendu (SO_ATTACH_BPF) au socket pour une utilisation comme filtre dans les paquets entrants. Un paquet sera abandonne si le programme de filtrage renvoie zero. Si le programme de filtrage renvoie une valeur differente de zero qui est moindre que la taille des donnees du paquet, celui-ci sera tronque a la taille renvoyee. Si la valeur renvoyee par le filtre est superieure ou egale a la taille des donnees du paquet, le paquet est autorise a continuer non modifie. L'argument pour SO_ATTACH_FILTER est une structure sock_fprog, definie dans : struct sock_fprog { unsigned short len; struct sock_filter *filter; }; L'argument pour SO_ATTACH_BPF est un descripteur de fichier renvoye par l'appel systeme bpf(2) et doit referer a un programme de type BPF_PROG_TYPE_SOCKET_FILTER. Ces options peuvent etre definies plusieurs fois pour un socket donne, remplacant a chaque fois le programme de filtre precedent. Les versions classiques et etendues peuvent etre appelees sur le meme socket, mais le filtre precedent sera toujours remplace de telle facon qu'un socket n'aura jamais plus d'un filtre defini. Les versions BPF classique et etendue sont expliquees 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 a l'utilisateur de definir un programme BPF classique (SO_ATTACH_REUSEPORT_CBPF) ou etendu (SO_ATTACH_REUSEPORT_EBPF) qui precise comment les paquets sont assignes aux sockets dans le groupe de reutilisation de port (c'est-a-dire tous les sockets qui ont SO_REUSEPORT active et qui utilisent la meme adresse locale pour recevoir des paquets). Le programme BPF doit renvoyer un indice entre 0 et N-1 representant le socket qui doit recevoir le paquet (ou N est le nombre de sockets dans le groupe). Si le programme BPF renvoie un indice non valable, la selection du socket reviendra au mecanisme strict SO_REUSEPORT. Les sockets sont numerotes dans l'ordre dont ils sont ajoutes dans le groupe (c'est-a-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 ajoutes a un groupe de reutilisation de port heriteront du programme BPF. Quand un socket est supprime d'un groupe de reutilisation (a l'aide de close(2)), le dernier socket sera deplace dans la position du socket ferme. Ces options peuvent etre definies a plusieurs reprises n'importe quand sur n'importe quel socket dans le groupe pour remplacer le programme BPF en cours utilise par tous les sockets du groupe. SO_ATTACH_REUSEPORT_CBPF prend le meme type d'argument que SO_ATTACH_FILTER et SO_ATTACH_REUSEPORT_EBPF prend le meme argument type que SO_ATTACH_BPF. La prise en charge d'UDP pour cette fonctionnalite est disponible depuis Linux 4.5. La prise en charge de TCP est disponible depuis Linux 4.6. SO_BINDTODEVICE Bind this socket to a particular device like "eth0", as specified in the passed interface name. If the name is an empty string or the option length is zero, the socket device binding is removed. The passed option is a variable-length null-terminated interface name string with the maximum size of IFNAMSIZ. If a socket is bound to an interface, only packets received from that particular interface are processed by the socket. Note that this works only for some socket types, particularly AF_INET sockets. It is not supported for packet sockets (use normal bind(2) there). Avant Linux 3.8, cette option de socket pouvait etre configuree, sans pouvoir etre lue par getsockopt(2). Depuis Linux 3.8, elle est lisible. Le parametre optlen doit contenir la taille du tampon destine a recevoir le nom du peripherique et il est recommande d'etre de IFNAMSZ octets. La veritable longueur du nom du peripherique est renvoyee dans le parametre optlen. SO_BROADCAST Definir ou lire l'attribut de diffusion. Une fois active, les sockets de datagrammes sont autorises a envoyer des paquets a une adresse de diffusion. Cette option n'a aucun effet sur les sockets orientes flux. SO_BSDCOMPAT Activer la compatibilite BSD bogue-a-bogue. Cela est utilise par le module du protocole UDP de Linux 2.0 et 2.2. Si cette compatibilite est activee, les erreurs ICMP recues pour un socket UDP ne seront pas transmises au programme utilisateur. Dans les versions recentes du noyau, la gestion de cette option a ete abandonnee progressivement : Linux 2.4 l'ignore silencieusement et Linux 2.6 genere une alerte noyau (printk()) si le programme utilise cette option. Linux 2.0 activait egalement les options de compatibilite BSD bogue-a-bogue (modification aleatoire des en-tetes, non prise en compte de l'attribut de diffusion) pour les sockets bruts ayant cette option, mais cela a ete elimine dans Linux 2.2. SO_DEBUG Activer le debogage de socket. Cela n'est autorise que pour les processus ayant la capacite CAP_NET_ADMIN ou un identifiant d'utilisateur effectif egal a 0. SO_DETACH_FILTER (since Linux 2.2) SO_DETACH_BPF (since Linux 3.19) Ces deux options, qui sont synonymes, peuvent etre utilisees pour retirer le programme BPF classique ou etendu attache a un socket avec soit SO_ATTACH_FILTER soit SO_ATTACH_BPF. La valeur d'option est ignoree. SO_DOMAIN (depuis Linux 2.6.32) Recuperer le domaine de socket sous forme d'entier, en renvoyant une valeur telle que AF_INET6. Consultez socket(2) pour plus de details. Cette option de socket peut etre seulement lue. SO_ERROR Lire et effacer l'erreur en cours sur le socket. Cette option de socket peut etre seulement lue. Un entier est attendu. SO_DONTROUTE Ne pas emettre par l'intermediaire d'une passerelle, n'envoyer qu'aux hotes directement connectes. Le meme effet peut etre obtenu avec l'attribut MSG_DONTROUTE durant une operation send(2) sur le socket. Un attribut entier booleen est attendu. SO_INCOMING_CPU (recuperable depuis Linux 3.19, modifiable depuis Linux 4.4) Definir ou obtenir l'affinite 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-a-dire tous les paquets pour le meme 4-tuple) arrivent sur une file d'attente RX unique qui est associee avec un CPU particulier, le cas d'utilisation classique est d'employer un processus d'ecoute par file RX, avec le flux entrant gere par un ecouteur sur le meme CPU gerant la file RX. Cela fournit un comportement NUMA optimal et conserve les caches de CPU prets. SO_INCOMING_NAPI_ID (recuperable depuis Linux 4.12) Renvoyer un ID unique au niveau systeme, appele ID NAPI qui est associe avec une file RX dans laquelle le dernier paquet associe a ce socket est recu. This can be used by an application to split the incoming flows among worker threads based on the RX queue on which the packets associated with the flows are received. It allows each worker thread to be associated with a NIC HW receive queue and service all the connection requests received on that RX queue. This mapping between an app thread and a HW NIC queue streamlines the flow of data from the NIC to the application. SO_KEEPALIVE Activer l'emission de messages periodiques gardant le socket ouvert pour les sockets orientes connexion. Un attribut entier booleen est attendu. SO_LINGER Definir ou lire l'option SO_LINGER. L'argument est une structure linger. struct linger { int l_onoff; /* attente activee */ int l_linger; /* duree d'attente en secondes */ }; Lorsque ce parametre est actif, un appel a close(2) ou shutdown(2) ne se terminera pas avant que tous les messages en attente pour le socket aient ete correctement emis ou que le delai d'attente soit ecoule. Sinon, l'appel se termine immediatement et la fermeture est effectuee en arriere-plan. Lorsque le socket est ferme au cours d'un exit(2), il attend toujours en arriere-plan. SO_LOCK_FILTER Lorsqu'elle est etablie cette option empechera la modification des filtres associes 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 privilegie pour definir un socket brut (une operation necessitant la capacite CAP_NET_RAW), appliquer un filtre restrictif, regler l'option SO_LOCK_FILTER et alors soit abandonner ses privileges soit passer le descripteur de fichier du socket a un processus non privilegie a l'aide d'un socket de domaine UNIX. Une fois que l'option SO_LOCK_FILTER a ete activee, essayer de modifier ou de supprimer le filtre attache a un socket, ou desactiver l'option SO_LOCK_FILTER echouera avec l'erreur EPERM. SO_MARK (depuis Linux 2.6.25) Set the mark for each packet sent through this socket (similar to the netfilter MARK target but socket-based). Changing the mark can be used for mark-based routing without netfilter or for packet filtering. Setting this option requires the CAP_NET_ADMIN or CAP_NET_RAW (since Linux 5.17) capability. SO_OOBINLINE Si cette option est activee, les donnees hors bande sont placees directement dans le flux des donnees recues. Sinon, elles ne sont transmises que si l'attribut MSG_OOB est defini durant la reception. SO_PASSCRED Enable or disable the receiving of the SCM_CREDENTIALS control message. For more information, see unix(7). SO_PASSSEC Enable or disable the receiving of the SCM_SECURITY control message. For more information, see unix(7). SO_PEEK_OFF (depuis Linux 3.4) Cette option, qui n'est a ce jour prise en charge que pour les sockets unix(7), definit la valeur de la premiere << position de lecture >> (<< peek offset >>) pour l'appel systeme recv(2) lorsqu'il est invoque avec l'attribut MSG_PEEK. Lorsque cette option recoit une valeur negative (elle est initialisee a -1 pour tout nouveau socket), elle se comporte classiquement : recv(2), avec l'attribut MSG_PEEK, lit les donnees au debut de la file. Lorsque l'option recoit une valeur superieure ou egale a zero, alors la lecture suivante des donnees en file d'attente dans le socket est realisee a la position precisee par la valeur de l'option. Dans le meme temps, la << position de lecture >> est incrementee du nombre d'octets lus dans la file, de facon a ce que la prochaine lecture renvoie la donnee suivante dans la file. Si des donnees sont retirees de la tete de la file par la fonction recv(2) (ou equivalent) sans l'attribut MSG_PEEK, alors la << position de lecture >> est diminuee du nombre d'octets supprimes. Autrement dit, l'acquisition de donnees sans avoir recours a l'attribut MSG_PEEK a pour effet de modifier la << position de lecture >>, de sorte que la prochaine lecture renvoie les donnees qui auraient ete renvoyees si aucune donnee n'avait ete supprimee. Pour les sockets de datagrammes, si la << position de lecture >> pointe a l'interieur d'un paquet, alors les donnees renvoyees seront marquees avec l'attribut MSG_TRUNC. L'exemple suivant illustre l'usage de SO_PEEK_OFF. Imaginons un socket de flux contenant les donnees suivantes dans sa file : aabbccddeeff La sequence suivante d'appels a recv(2) aura l'effet decrit dans les commentaires : int ov = 4; // Set peek offset to 4 setsockopt(fd, SOL_SOCKET, SO_PEEK_OFF, &ov, sizeof(ov)); recv(fd, buf, 2, MSG_PEEK); // Peeks "cc"; offset set to 6 recv(fd, buf, 2, MSG_PEEK); // Peeks "dd"; offset set to 8 recv(fd, buf, 2, 0); // Reads "aa"; offset set to 6 recv(fd, buf, 2, MSG_PEEK); // Peeks "ee"; offset set to 8 SO_PEERCRED Renvoyer les accreditations du processus pair connecte a ce socket. Pour plus de details, consultez unix(7). SO_PEERSEC (depuis Linux 2.6.2) Renvoyer le contexte de securite du socket pair connecte a ce socket. Pour plus de details, consultez unix(7) et ip(7). SO_PRIORITY Definir la priorite definie par le protocole pour tous les paquets envoyes sur ce socket. Linux utilise cette valeur pour trier les files reseau : les paquets avec une priorite elevee peuvent etre traites d'abord, en fonction de la gestion des files sur le peripherique selectionne. Etablir une priorite en dehors de l'intervalle allant de 0 a 6 necessite la capacite CAP_NET_ADMIN. SO_PROTOCOL (depuis Linux 2.6.32) Recuperer le protocole de socket sous forme d'entier, en renvoyant une valeur telle que IPPROTO_SCTP. Consultez socket(2) pour plus de details. Cette option de socket peut etre seulement lue et pas modifiee. SO_RCVBUF Definir ou lire la taille maximale en octets du tampon de reception. Le noyau double cette valeur (pour prevoir de l'espace pour les operations de service) lorsque la valeur est definie avec setsockopt(2) et cette valeur doublee est retournee par getsockopt(2). La valeur par defaut est definie par le fichier /proc/sys/net/core/rmem_default et la valeur maximale autorisee est definie par le fichier /proc/sys/net/core/rmem_max. La valeur (doublee) minimale pour cette option est 256. SO_RCVBUFFORCE (depuis Linux 2.6.14) En utilisant cette option de socket, un processus privilegie (CAP_NET_ADMIN) peut executer la meme tache que SO_RCVBUF, mais la limite rmem_max peut etre remplacee. SO_RCVLOWAT et SO_SNDLOWAT Indiquer le nombre minimal d'octets dans le tampon pour que la couche socket passe les donnees au protocole (SO_SNDLOWAT) ou a l'utilisateur en reception (SO_RCVLOWAT). Ces deux valeurs sont initialisees a 1. SO_SNDLOWAT n'est pas modifiable sur Linux (setsockopt(2) echoue 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 reglage SO_RCVLOWAT sur Linux et indiquaient un socket comme lisible meme si un seul octet etait disponible. Une prochaine lecture du socket bloquerait alors jusqu'a 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 Specify the receiving or sending timeouts until reporting an error. The argument is a struct timeval. If an input or output function blocks for this period of time, and data has been sent or received, the return value of that function will be the amount of data transferred; if no data has been transferred and the timeout has been reached, then -1 is returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if the socket was specified to be nonblocking. If the timeout is set to zero (the default), then the operation will never timeout. Timeouts only have effect for system calls that perform socket I/O (e.g., accept(2), connect(2), read(2), recvmsg(2), send(2), sendmsg(2)); timeouts have no effect for select(2), poll(2), epoll_wait(2), and so on. SO_REUSEADDR Indiquer que les regles utilisees pour la validation des adresses fournies dans un appel a bind(2) doivent autoriser la reutilisation des adresses locales. Pour les sockets AF_INET, cela signifie que le socket peut etre attache a n'importe quelle adresse sauf lorsqu'un socket actif en ecoute y est liee. Lorsque le socket en ecoute est attache a INADDR_ANY avec un port specifique, il n'est pas possible de s'attacher a ce port quelle que soit l'adresse locale. L'argument est un attribut booleen entier. SO_REUSEPORT (depuis Linux 3.9) Autoriser plusieurs sockets AF_INET ou AF_INET6 a etre lies a une adresse identique de socket. Cette option doit etre declaree sur chaque socket (y compris le premier socket) avant d'appeler bind(2) sur le socket. Pour prevenir le detournement de port, tous les processus relies a la meme adresse doivent avoir le meme UID effectif. Cette option peut etre employee avec les sockets TCP et UDP. Pour les sockets TCP, cette option autorise la repartition des charges accept(2) dans un serveur multithread pour etre renforcee en utilisant un socket d'ecoute pour chaque thread. Cela ameliore la repartition des charges par rapport aux techniques traditionnelles telles qu'un unique thread accept(2)ant qui repartit les connexions ou d'avoir plusieurs threads qui rivalisent pour accept(2) a partir du meme socket. Pour les sockets UDP, l'utilisation de cette option peut procurer une meilleure repartition des datagrammes entrants vers plusieurs processus (ou threads) par rapport aux techniques traditionnelles d'avoir plusieurs processus rivalisant pour recevoir des datagrammes sur le meme socket. SO_RXQ_OVFL (depuis Linux 2.6.33) Indiquer qu'un message auxiliaire (cmsg) sous la forme d'une valeur non signee et codee sur 32 bits doit etre joint aux tampons de socket (skb -- socket buffer), indiquant le nombre de paquets perdus par le socket depuis sa creation. SO_SELECT_ERR_QUEUE (depuis Linux 3.10) Quand cette option est activee sur un socket, une condition d'erreur sur un socket entraine une notification pas seulement a l'aide de l'ensemble exceptfds de select(2). De la meme facon, poll(2) renvoie aussi POLLPRI a chaque fois qu'un evenement POLLERR est renvoye. Contexte : cette option a ete ajoutee depuis que le reveil sur une condition d'erreur se produisait seulement au travers des ensembles readfds et writefds de select(2). Cette option a ete ajoutee pour permettre la supervision des conditions d'erreur a l'aide de l'argument exceptfds sans avoir simultanement a recevoir des notifications (a l'aide de readfds) pour des donnees regulieres pouvant etre lues a partir du socket. Apres les changements dans Linux 4.16, l'utilisation de cet indicateur n'est plus necessaire. Cette option est neanmoins conservee pour la retrocompatibilite. SO_SNDBUF Definir ou lire la taille maximale en octets du tampon d'emission. Le noyau double cette valeur (pour prevoir de l'espace pour les operations de service) lorsque la valeur est definie avec setsockopt(2), et cette valeur doublee est retournee par getsockopt(2). La valeur par defaut est definie par le fichier /proc/sys/net/core/wmem_default et la valeur maximale autorisee est definie par le fichier /proc/sys/net/core/wmem_max. La valeur (doublee) minimale pour cette option est 2048. SO_SNDBUFFORCE (depuis Linux 2.6.14) En utilisant cette option de socket, un processus privilegie (CAP_NET_ADMIN) peut executer la meme tache que SO_SNDBUF, mais la limite wmem_max peut etre remplacee. SO_TIMESTAMP Activer ou desactiver la reception des messages de controle SO_TIMESTAMP. Le message de controle d'horodatage est envoye avec le niveau SOL_SOCKET et un cmsg_type de SCM_TIMESTAMP. Le champ cmsg_data est une structure timeval indiquant la date de reception du dernier paquet fourni a l'utilisateur dans cet appel. Consultez cmsg(3) pour plus de details sur les messages de controle. SO_TIMESTAMPNS (depuis Linux 2.6.22) Activer ou desactiver la reception des messages de controle SO_TIMESTAMPNS. Le message de controle d'horodatage est envoye avec le niveau SOL_SOCKET et un cmsg_type de SCM_TIMESTAMPNS. Le champ cmsg_data est une structure timespec indiquant la date de reception du dernier paquet fourni a l'utilisateur dans cet appel. L'horloge utilisee pour l'horodatage est CLOCK_REALTIME. Consultez cmsg(3) pour plus de details sur les messages de controle. Un socket ne peut pas melanger 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 etre seulement lue, et pas modifiee. SO_BUSY_POLL (depuis Linux 3.11) Definir la duree approximative, en milliseconde, d'attente active de reception bloquante en absence de donnees. CAP_NET_ADMIN est necessaire pour augmenter cette valeur. La valeur par defaut pour cette option est controlee par le fichier /proc/sys/net/core/busy_read. La valeur dans le fichier /proc/sys/net/core/busy_poll determine la duree pendant laquelle select(2) et poll(2) seront en attente active lors d'une operation sur des sockets avec SO_BUSY_POLL defini et qu'aucun evenement a signaler n'est trouve. Dans les deux cas, l'attente active ne sera realisee que lorsque les dernieres donnees recues par le socket proviennent d'un peripherique reseau qui prend en charge cette option. Bien que l'attente active peut ameliorer la latence de quelques applications, une attention particuliere doit etre portee a son utilisation puisque cela augmentera a la fois l'utilisation du processeur et la consommation de puissance. Signaux Lors de l'ecriture sur un socket oriente connexion qui a ete ferme (localement ou a l'autre extremite), le signal SIGPIPE est envoye au processus qui ecrivait et EPIPE est renvoye. Le signal n'est pas envoye lorsque l'appel d'ecriture indique contenait l'attribut MSG_NOSIGNAL. Lorsque demande avec l'option FIOSETOWN de fcntl(2) ou l'option SIOCSPGRP de ioctl(2), le signal SIGIO est envoye quand un evenement d'entree-sortie a lieu. Il est possible d'utiliser poll(2) ou select(2) dans le gestionnaire de signal pour savoir sur quel socket l'evenement s'est produit. Une alternative (sous Linux 2.2) est de definir un signal en temps reel avec le fnctl(2) F_SETSIG. Le gestionnaire du signal en temps reel sera appele 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, differents processus accedant au meme socket), la condition ayant declenche le signal SIGIO peut avoir deja disparu quand le processus reagit au signal. Si cela se produit, le processus devrait attendre a nouveau, car Linux renverra ce signal ulterieurement. /proc interfaces Les parametres reseau de base des sockets sont accessibles en utilisant les fichiers du repertoire /proc/sys/net/core/. rmem_default contient la taille en octets par defaut du tampon de reception du socket. rmem_max contient la taille maximale en octets du tampon de reception qu'un utilisateur peut definir avec l'option SO_RCVBUF du socket. wmem_default contient la taille en octets par defaut du tampon d'emission du socket. wmem_max contient la taille maximale en octets du tampon d'emission qu'un utilisateur peut definir avec l'option SO_SNDBUF du socket. message_cost et message_burst configurent le filtrage par seau a jetons (token bucket) utilise pour limiter la charge des messages d'avertissement dus aux evenements reseau exterieurs. netdev_max_backlog contient le nombre maximal de paquets dans la file d'entree globale. optmem_max contient la taille maximale par socket des donnees auxiliaires et des donnees de controle utilisateur comme les << iovec >>. Ioctls Ces operations sont accessibles en utilisant ioctl(2) : error = ioctl(ip_socket, type_ioctl, &valeur_resultat); SIOCGSTAMP Renvoyer une structure timeval avec la date de reception du dernier paquet transmis a l'utilisateur. Cela est utile pour des mesures precises du temps de cheminement. Consultez setitimer(2) pour une description de la structure timeval. L'ioctl ne doit etre utilise que si les options SO_TIMESTAMP et SO_TIMESTAMPNS du socket ne sont pas definies. Sinon, la date du dernier paquet recu quand SO_TIMESTAMP et SO_TIMESTAMPNS n'etaient pas definies est renvoyee, ou un echec est constate si de tels paquets ne sont pas recus (c'est-a-dire que ioctl(2) renvoie -1 avec un errno defini a ENOENT). SIOCSPGRP Definir le processus ou le groupe de processus qui doivent recevoir les signaux SIGIO ou SIGURG quand les E/S deviennent possibles ou que des donnees urgentes sont disponibles. L'argument est un pointeur vers un pid_t. Pour d'autres details, consultez la description de F_SETOWN dans fcntl(2). FIOASYNC Changer l'attribut O_ASYNC pour activer ou desactiver le mode d'entree-sortie asynchrone du socket. Un mode d'entree-sortie asynchrone signifie que le signal SIGIO ou le signal defini avec F_SETSIG est envoye quand un evenement d'entree-sortie se produit. Le parametre est un entier booleen. (Cette operation est synonyme de l'utilisation de fcntl(2) pour definir l'attribut O_ASYNC). SIOCGPGRP Lire le processus ou le groupe de processus en cours auquel les signaux SIGIO ou SIGURG sont envoyes. Zero est obtenu quand aucun n'est defini. Operations fcntl(2) valables : FIOGETOWN Identique a l'ioctl(2) SIOCGPGRP. FIOSETOWN Identique a l'ioctl(2) SIOCSPGRP. VERSIONS SO_BINDTODEVICE a ete introduit dans Linux 2.0.30. SO_PASSCRED est une nouveaute de Linux 2.2. Les interfaces /proc ont ete introduites dans Linux 2.2. SO_RCVTIMEO et SO_SNDTIMEO sont geres depuis Linux 2.3.41. Auparavant, les delais d'attente etaient definis selon un reglage specifique aux protocoles et ne pouvaient etre ni lus ni modifies. NOTES Linux suppose que la moitie du tampon d'emission/reception est utilise 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 cable. Linux ne permettra la reutilisation des ports qu'avec l'option SO_REUSEADDR lorsque celle-ci sera definie a la fois par le precedent programme qui a effectue un bind(2) sur le port et par le programme qui veut reutiliser ce port. Cela differe de certaines implementations (par exemple, sur FreeBSD) ou seul le dernier programme doit definir l'option SO_REUSEADDR. Habituellement, cette difference est invisible, puisque, par exemple, un programme serveur est concu pour toujours definir 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Paul Guillonneau Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 16 janvier 2024 socket(7)