Scroll to navigation

ACCEPT(2) Manuel du programmeur Linux ACCEPT(2)

NOM

accept, accept4 - Accepter une connexion sur une socket

SYNOPSIS

#include <sys/types.h>          /* Consultez NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
#define _GNU_SOURCE             /* Consultez feature_test_macros(7) */
#include <sys/socket.h>
int accept4(int sockfd, struct sockaddr *addr,
            socklen_t *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 de la socket sockfd à l'écoute, crée une nouvelle socket et alloue pour cette socket un nouveau descripteur de fichier qu'il renvoie. La nouvelle socket n'est pas en état d'écoute. La socket originale sockfd n'est pas modifiée par l'appel système.

L'argument sockfd est une socket qui a été créée avec la fonction socket(2), attachée à 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 la socket n'est pas marquée comme non‐bloquante, accept() se met en attente d'une connexion. Si la socket est non‐bloquante, et qu'aucune connexion n'est présente dans la file, accept() retourne une erreur EAGAIN ou EWOULDBLOCK.

In order to be notified of incoming connections on a socket, you can use select(2), poll(2), or epoll(7). A readable event will be delivered when a new connection is attempted and you may then call accept() to get a socket for that connection. Alternatively, you can set the socket to deliver SIGIO when activity occurs on a socket; see socket(7) for details.

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
Set the O_NONBLOCK file status flag on the open file description (see open(2)) referred to by the new file descriptor. Using this flag saves extra calls to fcntl(2) to achieve the same result.
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 DE RETOUR

On success, these system calls return a nonnegative integer that is a file descriptor for the accepted socket. On error, -1 is returned, errno is set appropriately, and addrlen is left unchanged.

Traitement des erreurs

Sous Linux, accept() (et accept4()) renvoie les erreurs réseau déjà en attente sur la 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
The socket is marked nonblocking and no connections are present to be accepted. POSIX.1-2001 and POSIX.1-2008 allow either error to be returned for this case, and do not require these constants to have the same value, so a portable application should check for both possibilities.
EBADF
sockfd is not an open file descriptor.
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 valide ne survienne ; consultez signal(7).
EINVAL
La socket n'est pas en attente de connexions, ou addrlen est invalide (par exemple négatif).
EINVAL
(accept4()) flags contient une valeur incorrecte.
EMFILE
The per-process limit on the number of open file descriptors has been reached.
ENFILE
The system-wide limit on the total number of open files has been reached.
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
The file descriptor sockfd does not refer to a socket.
EOPNOTSUPP
La socket utilisée n'est pas de type SOCK_STREAM.
EPROTO
Erreur de protocole.

De plus, la version Linux de accept() peut échouer si :

EPERM
Les règles du pare-feu interdisent la connexion.

De plus il peut se produire des erreurs réseau dépendant du protocole de la 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

L'appel système accept4() est disponible depuis Linux 2.6.28 ; la prise en charge dans la glibc est disponible depuis la version 2.10.

CONFORMITÉ

accept(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (accept() first appeared in 4.2BSD).

accept4() est une extension non standard de Linux.

Avec la version Linux de accept(), la nouvelle socket n'hérite pas des attributs comme O_NONBLOCK et O_ASYNC de la 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 la socket renvoyée par accept().

NOTES

POSIX.1-2001 ne requiert pas l'inclusion de <sys/types.h>, et cet en‐tête n'est pas nécessaire sous Linux. Cependant, il doit être inclus sous certaines implémentations historiques (BSD), et les applications portables devraient probablement l'utiliser.

There may not always be a connection waiting after a SIGIO is delivered or select(2), poll(2), or epoll(7) return a readability event because the connection might have been removed by an asynchronous network error or another thread before accept() is called. If this happens, then the call will block waiting for the next connection to arrive. To ensure that accept() never blocks, the passed socket sockfd needs to have the O_NONBLOCK flag set (see socket(7)).

For certain protocols which require an explicit confirmation, such as DECnet, accept() can be thought of as merely dequeuing the next connection request and not implying confirmation. Confirmation can be implied by a normal read or write on the new file descriptor, and rejection can be implied by closing the new socket. Currently, only DECnet has these semantics on Linux.

Le type socklen_t

In the original BSD sockets implementation (and on other older systems) the third argument of accept() was declared as an int *. A POSIX.1g draft standard wanted to change it into a size_t *C; later POSIX standards and glibc 2.x have socklen_t * .

EXEMPLE

Consultez bind(2).

VOIR AUSSI

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

COLOPHON

Cette page fait partie de la publication 5.05 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <http://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> et Frédéric Hantrais <fhantrais@gmail.com>

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

6 mars 2019 Linux