Man page - accept(2)

Packages contains this manual

Available languages:

en fr pl ja ru zh_TW zh_CN de

Manual

accept

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
Traitement des erreurs
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
NOTES
Le type socklen_t
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

accept, accept4 - Accepter une connexion sur un socket

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/socket.h>

int accept(int sockfd , struct sockaddr *_Nullable restrict addr ,
socklen_t *_Nullable restrict
addrlen );

#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sys/socket.h>

int accept4(int sockfd , struct sockaddr *_Nullable restrict addr ,
socklen_t *_Nullable restrict
addrlen , int flags );

DESCRIPTION

L’appel systĂšme accept () est employĂ© avec les sockets utilisant un protocole en mode connectĂ© ( SOCK_STREAM , SOCK_SEQPACKET ). Il extrait la premiĂšre connexion de la file des connexions en attente du socket sockfd Ă  l’écoute, crĂ©e un nouveau socket et alloue pour ce socket un nouveau descripteur de fichier qu’il renvoie. Le nouveau socket n’est pas en Ă©tat d’écoute. L socket original sockfd n’est pas modifiĂ© par l’appel systĂšme.

L’argument sockfd est un socket qui a Ă©tĂ© créé avec la fonction socket (2), attachĂ© Ă  une adresse avec bind (2), et attend des connexions aprĂšs un appel listen (2).

L’argument addr est un pointeur sur une structure sockaddr . La structure sera remplie avec l’adresse du correspondant se connectant, telle qu’elle est connue par la couche de communication. Le format exact du paramĂštre addr dĂ©pend du domaine dans lequel la communication s’établit (consultez socket (2) et la page de manuel correspondant au protocole). Quand addr vaut NULL, rien n’est rempli ; dans ce cas, addrlen n’est pas utilisĂ© et doit aussi valoir NULL.

addrlen est un paramĂštre-rĂ©sultat : l’appelant doit l’initialiser de telle sorte qu’il contienne la taille (en octets) de la structure pointĂ©e par addr , et est renseignĂ© au retour par la longueur rĂ©elle (en octets) de l’adresse remplie.

L’adresse renvoyĂ©e est tronquĂ©e si le tampon fourni est trop petit ; dans ce cas, addrlen renverra une valeur supĂ©rieure Ă  celle fournie lors de l’appel.

S’il n’y a pas de connexion en attente dans la file, et si le socket n’est pas marquĂ© comme non bloquant, accept () se met en attente d’une connexion. Si le socket est non bloquant, et qu’aucune connexion n’est prĂ©sente dans la file, accept () retourne une erreur EAGAIN ou EWOULDBLOCK .

Pour ĂȘtre prĂ©venu de l’arrivĂ©e d’une connexion sur un socket, on peut utiliser select (2), poll (2) ou epoll (7). Un Ă©vĂ©nement « lecture » sera dĂ©livrĂ© lorsqu’une tentative de connexion aura lieu, et on pourra alors appeler accept () pour obtenir un socket pour cette connexion. Autrement, on peut configurer le socket pour qu’il envoie un signal SIGIO lorsqu’une activitĂ© le concernant se produit, consultez socket (7) pour plus de dĂ©tails.

Si flags vaut 0 alors accept4 () est identique Ă  accept (). Les valeurs suivantes peuvent ĂȘtre combinĂ©es dans flags par un OU binaire pour obtenir un comportement diffĂ©rent :

SOCK_NONBLOCK

Placer l’attribut d’état de fichier O_NONBLOCK sur la description du fichier ouvert rĂ©fĂ©rencĂ©e par le nouveau descripteur de fichier (consulter open (2)). Utiliser cet attribut Ă©conomise des appels supplĂ©mentaires Ă  fcntl (2) pour obtenir le mĂȘme rĂ©sultat.

SOCK_CLOEXEC

Placer l’attribut « close-on-exec » ( FD_CLOEXEC ) sur le nouveau descripteur de fichier. Consultez la description de l’attribut O_CLOEXEC dans open (2) pour savoir pourquoi cela peut ĂȘtre utile.

VALEUR RENVOYÉE

S’ils rĂ©ussissent, ces appels systĂšme renvoient un descripteur de fichier pour le socket acceptĂ© (un entier positif ou nul). En cas d’erreur, ils renvoient -1 , errno est positionnĂ© pour indiquer l’erreur et addrlen est laissĂ© inchangĂ©.

Traitement des erreurs

Sous Linux, accept () (et accept4 ()) renvoie les erreurs rĂ©seau dĂ©jĂ  en attente sur le nouveau socket comme une erreur de l’appel systĂšme. Ce comportement diffĂšre d’autres implĂ©mentations des sockets BSD. Pour un comportement fiable, une application doit dĂ©tecter les erreurs rĂ©seau dĂ©finies par le protocole aprĂšs le accept () et les traiter comme des erreurs EAGAIN , en rĂ©itĂ©rant le mĂ©canisme. Dans le cas de TCP/IP, ces erreurs sont ENETDOWN , EPROTO , ENOPROTOOPT , EHOSTDOWN , ENONET , EHOSTUNREACH , EOPNOTSUPP , et ENETUNREACH .

ERREURS

EAGAIN ou EWOULDBLOCK

Le socket est marquĂ© comme Ă©tant non bloquant et aucune connexion n’est prĂ©sente pour ĂȘtre acceptĂ©e. POSIX.1-2001 et POSIX.1-2008 permettent de renvoyer l’une ou l’autre des erreurs dans ce cas et n’exige pas que ces constantes aient la mĂȘme valeur. Une application portable devrait donc tester les deux possibilitĂ©s.

EBADF

sockfd n’est pas un descripteur de fichier valable.

ECONNABORTED

Une connexion a été abandonnée.

EFAULT

addr n’est pas dans l’espace d’adressage accessible en Ă©criture.

EINTR

L’appel systĂšme a Ă©tĂ© interrompu par l’arrivĂ©e d’un signal avant qu’une connexion valable ne survienne ; consultez signal (7).

EINVAL

Le socket n’est pas en attente de connexions, ou addrlen est non autorisĂ©e (par exemple nĂ©gatif).

EINVAL

( accept4 ()) flags contient une valeur incorrecte.

EMFILE

La limite du nombre de descripteurs de fichiers par processus a été atteinte.

ENFILE

La limite du nombre total de fichiers ouverts pour le systÚme entier a été atteinte.

ENOBUFS

ENOMEM

Pas assez de mémoire disponible. En général, cette erreur est due à la taille limitée du tampon des sockets, et non à la mémoire systÚme proprement dite.

ENOTSOCK

Le descripteur de fichier sockfd ne fait pas référence à un socket.

EOPNOTSUPP

Le socket utilisĂ© n’est pas de type SOCK_STREAM .

EPERM

Les rĂšgles du pare-feu interdisent la connexion.

EPROTO

Erreur de protocole.

De plus il peut se produire des erreurs rĂ©seau dĂ©pendant du protocole du socket. Certains noyaux Linux peuvent renvoyer d’autres erreurs comme ENOSR , ESOCKTNOSUPPORT , EPROTONOSUPPORT , ETIMEDOUT . L’erreur ERESTARTSYS peut ĂȘtre rencontrĂ©e durant un suivi dans un dĂ©bogueur.

VERSIONS

Avec la version Linux de accept (), le nouveau socket n’hĂ©rite pas des attributs comme O_NONBLOCK et O_ASYNC du socket en Ă©coute. Ce comportement est diffĂ©rent de l’implĂ©mentation BSD de rĂ©fĂ©rence. Les programmes portables ne doivent pas s’appuyer sur cette particularitĂ©, et doivent reconfigurer les attributs sur le socket renvoyĂ© par accept ().

STANDARDS

accept ()

POSIX.1-2008.

accept4 ()

Linux.

HISTORIQUE

accept ()

POSIX.1-2001, SVr4, 4.4BSD ( accept () est apparu dans 4.2BSD).

accept4 ()

Linux 2.6.28, glibc 2.10.

NOTES

Il n’y a pas nĂ©cessairement de connexion en attente aprĂšs la rĂ©ception de SIGIO ou aprĂšs que select (2), poll (2) ou epoll (7) indiquent quelque chose Ă  lire. En effet la connexion peut avoir Ă©tĂ© annulĂ©e Ă  cause d’une erreur de rĂ©seau asynchrone ou par un autre thread avant que accept () ne soit appelĂ©. Si cela se produit, l’appel bloquera en attendant une autre connexion. Pour s’assurer que accept () ne bloquera jamais, le socket sockfd transmis doit avoir l’attribut O_NONBLOCK (consultez socket (7)).

Pour certains protocoles nĂ©cessitant une confirmation explicite, comme DECNet, accept () peut ĂȘtre considĂ©rĂ© comme extrayant simplement la connexion suivante de la file, sans demander de confirmation. On peut effectuer la confirmation par une simple lecture ou Ă©criture sur le nouveau descripteur, et le rejet en fermant le nouveau socket. Pour le moment, seul DECNet se comporte ainsi sous Linux.

Le type socklen_t

Dans l’implĂ©mentation des sockets de BSD originale (et sur d’autres anciens systĂšmes), le troisiĂšme paramĂštre de accept () Ă©tait dĂ©clarĂ© en tant que int * . Un brouillon du standard POSIX.1g voulait le changer pour size_t * C ; les derniers standards POSIX et glibc 2.x mentionnent socklen_t * .

EXEMPLES

Consultez bind (2).

VOIR AUSSI

bind (2), connect (2), listen (2), select (2), socket (2), socket (7)

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-Philippe MENGUAL <jpmengual@debian.org>

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 .