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 |
---|---|
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction. | |
Une connexion entrante a été indiquée, mais a ensuite été arrêtée par l’homologue distant avant d’accepter l’appel. | |
Le paramètre addrlen est trop petit ou addr n’est pas une partie valide de l’espace d’adressage utilisateur. | |
Un appel Windows Sockets 1.1 bloquant a été annulé via WSACancelBlockingCall. | |
La fonction listen n’a pas été appelée avant l’acceptation. | |
Un appel Windows Sockets 1.1 bloquant est en cours ou le fournisseur de services traite toujours une fonction de rappel. | |
La file d’attente est vide lors de l’entrée à accepter et aucun descripteur n’est disponible. | |
Le sous-système réseau a échoué. | |
Aucune zone tampon disponible. | |
Le descripteur n’est pas un socket. | |
Le socket référencé n’est pas un type qui prend en charge le service orienté connexion. | |
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.
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 |