ACCEPT(2)

NOM
accept - Accepter une connexion sur une socket.

SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sock, struct sockaddr *addr, int *addrlen);

DESCRIPTION
accept est utilise generalement avec des processus serveurs orientes-connexion. L'argument sock est une socket qui a ete creee avec la fonction socket(2). On lui a affecte une adresse avec bind(2). Enfin on a indique au systeme, avec listen(2) qu'elle desirait recevoir des connexions entrantes. L'appel systeme accept extrait la premiere connexion de la file des connexions en attente, cree une nouvelle socket avec les memes proprietes que sock et alloue un nouveau descripteur de fichier pour cette socket. S'il n'y a pas de connexion en attente dans la file, et si la socket est bloquante, accept se met en attente d'une connexion. Si la socket est non-bloquante, et qu'aucune connexion n'est presente dans la file, accept retourne une erreur decrite ci-dessous. Une socket acceptee ne peut pas etre utilisee pour accepter de nouvelles connexions. La socket originale sock reste ouverte. L'argument addr est un parametre resultat qui est renseigne avec l'adresse de l'entite se connectant, telle qu'elle est connue par la couche de communication. Le format exact du parametre addr est fonction du domaine dans lequel la communication s'etablit. Le parametre-resultat addrlen est renseigne avec la longueur (en octets) de l'adresse retournee. Ce parametre doit initialement contenir la longueur du parametre addr. Cet appel systeme est utilise avec les sockets utilisant un protocole en mode connecte, generalement du type SOCK_STREAM. Lorsque l'on desire accepter des connexions sur plusieurs sockets simultanement, il est important de ne pas rester bloque en attente avec l'appel accept sur une seule d'entre elles. Il est alors possible d'utiliser l'appel-systeme select(2) sur l'ensemble des sockets pour determiner la disponibilite des donnees a lire, et d'effectuer ensuite l'appel accept sur celles qui ont effectivement recu des demandes de connexion. Pour certain protocoles necessitant une confirmation explicite, comme ISO ou DATAKIT, accept peut etre considere comme extrayant simplement la connexion suivante de la file, sans demander de confirmation. Cette confirmation peut etre effectuee par une simple lecture ou ecriture sur le nouveau descripteur de fichier, et un rejet peut etre effectue en fermant simplement la nouvelle socket. On peut obtenir les donnees utilisateur d'une connexion sans confirmation, en effectuant un appel-systeme recvmsg(2) avec un msg_iovlen valant zero, et un msg_controllen non nul, ou en effectuant une demande getsockopt(2). De meme on peut fournir des informations sur un rejet de connexion en utilisant un appel sendmsg(2) en fournissant uniquement les donnees de controle, ou en appelant setsockopt(2).

VALEUR RENVOYEE
accept renvoie -1 en cas d'erreur. S'il reussit il renvoie un entier non-negatif, constituant un descripteur pour la nouvelle socket.

ERREURS

EBADF
    sock est un descripteur invalide.

ENOTSOCK
    sock est un descripteur de fichier, pas de socket.

EOPNOTSUPP
    La socket de reference n'est pas de type SOCK_STREAM.

EFAULT
    addr pointe en-dehors de l'espace d'adresse accessible.

EWOULDBLOCK
    La socket est non-bloquante et aucune connexion n'est presente dans la file.

EXEMPLE
Un scenario typique de mise en oeuvre de serveur oriente connexion est le suivant :
int  pnum;
int  sock;
int  nouvelle;
sock  = socket (famille, type, 0);
if (sock < 0) {
    perror ("socket");
    exit (1);
}
if (bind (sock, & mon_adresse, longueur_adresse) < 0) {
    perror ("bind");
    exit (1);
}
if (listen (sock, 5) < 0) {
    perror ("listen");
    exit (1);
}
while (1) {
    nouvelle = accept (sock, & adresse_client, & lg_adresse_client);
    if (nouvelle < 0) {
        perror ("accept");
        exit (1);
    }
    if ((pnum = fork ()) == 0) {
        /* Processus fils */
        close (sock);
        Traiter_le_client (nouvelle);
        exit (0);
    }
    if (pnum > 0) {
        /* Processus pere */
        close (nouvelle);
        /* Attendre la connexion suivante */
        continue;
    }
    perror ("fork");
    exit (1);
}

CONFORMITE
SVr4, BSD 4.4. La fonction accept est apparue dans BSD 4.2. SVr4 fournit une condition d'erreur supplementaire EOPNOTSUPP.

VOIR AUSSI
bind(2), connect(2), listen(2), select(2), socket(2)