accept, fonction (winsock2.h)

La fonction accept autorise une tentative de connexion entrante sur un socket.

Syntaxe

SOCKET WSAAPI accept(
  [in]      SOCKET   s,
  [out]     sockaddr *addr,
  [in, out] int      *addrlen
);

Paramètres

[in] s

Descripteur qui identifie un socket qui a été placé dans un état d’écoute avec la fonction listen . La connexion est en fait établie avec le socket retourné par accept.

[out] addr

Pointeur facultatif vers une mémoire tampon qui reçoit l’adresse de l’entité de connexion, telle que connue pour la couche de communications. Le format exact du paramètre addr est déterminé par la famille d’adresses qui a été établie lors de la création du socket à partir de la structure sockaddr .

[in, out] addrlen

Pointeur facultatif vers un entier qui contient la longueur de la structure pointée par le paramètre addr .

Valeur retournée

Si aucune erreur ne se produit, accept retourne une valeur de type SOCKET qui est un descripteur pour le nouveau socket. Cette valeur retournée est un handle pour le socket sur lequel la connexion réelle est établie.

Sinon, une valeur de INVALID_SOCKET est retournée et un code d’erreur spécifique peut être récupéré en appelant WSAGetLastError.

L’entier auquel fait référence addrlen contient initialement la quantité d’espace pointée par addrlen. Au retour, il contient la longueur réelle en octets de l’adresse retournée.

Code d'erreur Signification
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAECONNRESET
Une connexion entrante a été indiquée, mais a ensuite été arrêtée par l’homologue distant avant d’accepter l’appel.
WSAEFAULT
Le paramètre addrlen est trop petit ou addr n’est pas une partie valide de l’espace d’adressage utilisateur.
WSAEINTR
Un appel Windows Sockets 1.1 bloquant a été annulé via WSACancelBlockingCall.
WSAEINVAL
La fonction listen n’a pas été appelée avant l’acceptation.
WSAEINPROGRESS
Un appel Windows Sockets 1.1 bloquant est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEMFILE
La file d’attente est vide lors de l’entrée à accepter et aucun descripteur n’est disponible.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAENOBUFS
Aucune zone tampon disponible.
WSAENOTSOCK
Le descripteur n’est pas un socket.
WSAEOPNOTSUPP
Le socket référencé n’est pas un type qui prend en charge le service orienté connexion.
WSAEWOULDBLOCK
Le socket est marqué comme non bloquant et aucune connexion n’est présente pour être acceptée.

Remarques

La fonction accept extrait la première connexion de la file d’attente des connexions en attente sur les sockets. Il crée et retourne ensuite un handle dans le nouveau socket. Le socket nouvellement créé est le socket qui gérera la connexion réelle ; il a les mêmes propriétés que les sockets, y compris les événements asynchrones inscrits avec les fonctions WSAAsyncSelect ou WSAEventSelect .

La fonction accept peut bloquer l’appelant jusqu’à ce qu’une connexion soit présente si aucune connexion en attente n’est présente dans la file d’attente et que le socket est marqué comme bloquant. Si le socket est marqué comme non bloquant et qu’aucune connexion en attente n’est présente dans la file d’attente, accepter renvoie une erreur comme décrit dans la section suivante. Une fois la réussite de l’acceptation retournée un nouveau handle de socket, le socket accepté ne peut plus être utilisé pour accepter davantage de connexions. Le socket d’origine reste ouvert et écoute les nouvelles demandes de connexion.

Le addr de paramètre est un paramètre de résultat qui est rempli avec l’adresse de l’entité de connexion, telle que connue pour la couche de communication. Le format exact du paramètre addr est déterminé par la famille d’adresses dans laquelle la communication se produit. Addrlen est un paramètre value-result ; il doit initialement contenir la quantité d’espace pointée par addr ; lors du retour, il contiendra la longueur réelle (en octets) de l’adresse retournée.

La fonction accept est utilisée avec les types de sockets orientés connexion tels que SOCK_STREAM. Si addr et/ou addrlen sont égaux à NULL, aucune information sur l’adresse distante du socket accepté n’est retournée.

Note Lors de l’émission d’un appel Winsock bloquant tel que accept, Winsock peut avoir besoin d’attendre un événement réseau avant que l’appel puisse se terminer. Winsock effectue une attente pouvant être alertée dans cette situation, qui peut être interrompue par un appel de procédure asynchrone (APC) planifié sur le même thread. L’émission d’un autre appel Winsock bloquant à l’intérieur d’un APC qui interrompt un appel Winsock bloquant en cours sur le même thread entraîne un comportement non défini et ne doit jamais être tenté par les clients Winsock.
 

Exemple de code

L’exemple suivant illustre l’utilisation de la fonction accept .
#ifndef UNICODE
#define UNICODE
#endif

#include <winsock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <windows.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int wmain(void)
{

    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_port = htons(27015);
    inet_pton(AF_INET, "127.0.0.1", &service.sin_addr);

    if (bind(ListenSocket,
             (SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) {
        wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 1) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Create a SOCKET for accepting incoming requests.
    SOCKET AcceptSocket;
    wprintf(L"Waiting for client to connect...\n");

    //----------------------
    // Accept the connection.
    AcceptSocket = accept(ListenSocket, NULL, NULL);
    if (AcceptSocket == INVALID_SOCKET) {
        wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    } else
        wprintf(L"Client connected.\n");

    // No longer need server socket
    closesocket(ListenSocket);

    WSACleanup();
    return 0;
}


Pour obtenir un autre exemple qui utilise la fonction accept, consultez Prise en main With Winsock.

Remarques relatives au guichet automatique

Les problèmes importants liés à la configuration de la connexion sont les suivants et doivent être pris en compte lors de l’utilisation du mode de transfert asynchrone (ATM) avec Windows Sockets 2 :

  • Les fonctions accept et WSAAccept ne définissent pas nécessairement les paramètres d’adresse distante et de longueur d’adresse. Par conséquent, lors de l’utilisation d’ATM, l’appelant doit utiliser la fonction WSAAccept et placer ATM_CALLING_PARTY_NUMBER_IE dans le membre ProviderSpecific de la structure QoS , qui est lui-même inclus dans le paramètre lpSQOS de la fonction de rappel utilisée conformément à WSAAccept.
  • Lors de l’utilisation de la fonction d’acceptation , sachez que la fonction peut revenir avant que l’établissement de la connexion ait parcouru toute la distance entre l’expéditeur et le récepteur. En effet, la fonction accept retourne dès qu’elle reçoit un message CONNECT ACK ; dans ATM, un message CONNECT ACK est retourné par le commutateur suivant dans le chemin dès qu’un message CONNECT est traité (plutôt que l’ACK CONNECT envoyé par le nœud de fin auquel la connexion est finalement établie). Par conséquent, les applications doivent se rendre compte que si des données sont envoyées immédiatement après la réception d’un message CONNECT ACK, la perte de données est possible, car la connexion n’a peut-être pas été établie entre l’expéditeur et le destinataire.

Windows 8.1 et Windows Server 2012 R2 : cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 8.1, Windows Vista [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête winsock2.h
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

WSAAccept

WSAAsyncSelect

Winsock Functions

Référence Winsock

bind

connect

listen

select

sockaddr

socket