Partager via


fonction select (winsock2.h)

La fonction select détermine le status d’un ou de plusieurs sockets, en attente si nécessaire, d’effectuer des E/S synchrones.

Syntaxe

int WSAAPI select(
  [in]      int           nfds,
  [in, out] fd_set        *readfds,
  [in, out] fd_set        *writefds,
  [in, out] fd_set        *exceptfds,
  [in]      const timeval *timeout
);

Paramètres

[in] nfds

Ignoré. Le paramètre nfds est inclus uniquement pour la compatibilité avec les sockets Berkeley.

[in, out] readfds

Pointeur facultatif vers un ensemble de sockets à vérifier pour la lisibilité.

[in, out] writefds

Pointeur facultatif vers un ensemble de sockets à vérifier pour la facilité d’écriture.

[in, out] exceptfds

Pointeur facultatif vers un ensemble de sockets à vérifier pour les erreurs.

[in] timeout

Durée maximale d’attente de la sélection , fournie sous la forme d’une structure TIMEVAL . Définissez le paramètre de délai d’expiration sur null pour les opérations de blocage.

Valeur retournée

La fonction select retourne le nombre total de handles de socket prêts et contenus dans les structures de fd_set , zéro si la limite de temps a expiré ou SOCKET_ERROR si une erreur s’est produite. Si la valeur de retour est SOCKET_ERROR, WSAGetLastError peut être utilisé pour récupérer un code d’erreur spécifique.

Code d'erreur Signification
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAEFAULT
L’implémentation de Sockets Windows n’a pas pu allouer les ressources nécessaires à ses opérations internes, ou les readfds, writefds, exceptfds ou timeval paramètres ne font pas partie de l’espace d’adressage utilisateur.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAEINVAL
La valeur de délai d’attente n’est pas valide ou les trois paramètres de descripteur étaient null.
WSAEINTR
Un appel bloquant Windows Socket 1.1 a été annulé via WSACancelBlockingCall.
WSAEINPROGRESS
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAENOTSOCK
L’un des jeux de descripteurs contient une entrée qui n’est pas un socket.

Remarques

La fonction select est utilisée pour déterminer la status d’un ou plusieurs sockets. Pour chaque socket, l’appelant peut demander des informations sur la lecture, l’écriture ou les status d’erreur. L’ensemble de sockets pour lesquels un status donné est demandé est indiqué par une structure fd_set. Les sockets contenus dans les structures fd_set doivent être associés à un fournisseur de services unique. Dans le cadre de cette restriction, les sockets sont considérés comme provenant du même fournisseur de services si les structures WSAPROTOCOL_INFO décrivant leurs protocoles ont la même valeur providerId . Au retour, les structures sont mises à jour pour refléter le sous-ensemble de ces sockets qui répondent à la condition spécifiée. La fonction select retourne le nombre de sockets répondant aux conditions. Un ensemble de macros est fourni pour manipuler une structure fd_set . Ces macros sont compatibles avec celles utilisées dans le logiciel Berkeley, mais la représentation sous-jacente est complètement différente.

Le paramètre readfds identifie les sockets qui doivent être vérifiés pour la lisibilité. Si le socket est actuellement à l’état d’écoute , il est marqué comme lisible si une demande de connexion entrante a été reçue de sorte qu’une acceptation est garantie de se terminer sans blocage. Pour les autres sockets, la lisibilité signifie que les données mises en file d’attente sont disponibles pour la lecture, de sorte qu’un appel à recv, WSARecvFrom, WSARecvFrom ou recvfrom n’est pas bloqué.

Pour les sockets orientés connexion, la lisibilité peut également indiquer qu’une demande de fermeture du socket a été reçue de l’homologue. Si le circuit virtuel a été fermé correctement et que toutes les données ont été reçues, une recv est immédiatement retournée avec zéro octet lus. Si le circuit virtuel a été réinitialisé, une recv se termine immédiatement avec un code d’erreur tel que WSAECONNRESET. La présence de données OOB est vérifiée si l’option de socket SO_OOBINLINE a été activée (voir setsockopt).

Le paramètre writefds identifie les sockets qui doivent être vérifiés pour l’écriture. Si un socket traite un appel de connexion (non bloquant), un socket est accessible en écriture si l’établissement de la connexion se termine correctement. Si le socket ne traite pas d’appel de connexion , l’écriture signifie qu’un send, sendto ou WSASendto est garanti. Toutefois, ils peuvent bloquer sur un socket bloquant si le paramètre len dépasse la quantité d’espace de mémoire tampon système sortant disponible. Il n’est pas spécifié la durée pendant laquelle ces garanties peuvent être considérées comme valides, en particulier dans un environnement multithread.

Le paramètre exceptfds identifie les sockets à vérifier pour la présence de données OOB ou de conditions d’erreur exceptionnelles.

Note Les données hors bande ne sont signalées de cette manière que si l’option SO_OOBINLINE est FALSE. Si un socket traite un appel de connexion (non bloquant), l’échec de la tentative de connexion est indiqué dans exceptfds (l’application doit alors appeler getsockopt SO_ERROR pour déterminer la valeur d’erreur pour décrire la raison de l’échec). Ce document ne définit pas les autres erreurs qui seront incluses.
 
Deux des paramètres, readfds, writefds ou exceptfds, peuvent être donnés comme null. Au moins un doit être non null, et tout jeu de descripteur non null doit contenir au moins un handle dans un socket.

En résumé, un socket est identifié dans un ensemble particulier lorsque la sélection retourne si :

readfds :

  • Si listen a été appelé et qu’une connexion est en attente, accept réussit.
  • Les données sont disponibles pour la lecture (inclut les données OOB si SO_OOBINLINE est activé).
  • La connexion a été fermée/réinitialisée/terminée.
writefds :
  • Si le traitement d’un appel de connexion (sans blocage), la connexion a réussi.
  • Les données peuvent être envoyées.
exceptfds :
  • Si le traitement d’un appel de connexion (non bloquant), la tentative de connexion a échoué.
  • Les données OOB sont disponibles pour la lecture (uniquement si SO_OOBINLINE est désactivé).
Quatre macros sont définies dans le fichier d’en-tête Winsock2.h pour manipuler et vérifier les jeux de descripteurs. La variable FD_SETSIZE détermine le nombre maximal de descripteurs dans un ensemble. (La valeur par défaut de FD_SETSIZE est 64, qui peut être modifiée en définissant FD_SETSIZE à une autre valeur avant d’inclure Winsock2.h.) En interne, les handles de socket dans une structure de fd_set ne sont pas représentés en tant qu’indicateurs de bits comme dans Berkeley Unix. Leur représentation des données est opaque. L’utilisation de ces macros maintient la portabilité logicielle entre différents environnements de socket. Les macros à manipuler et à case activée contenu fd_set sont les suivantes :
  • FD_ZERO(*set) : initialise l’ensemble vide. Un ensemble doit toujours être effacé avant d’utiliser.
  • FD_CLR(s, *set) : supprime les sockets de l’ensemble.
  • FD_ISSET(s, *set) : vérifie si s est membre de set et retourne TRUE si c’est le cas.
  • FD_SET(s, *set) : ajoute des sockets à set.

Le délai d’expiration du paramètre contrôle la durée de la sélection . Si le délai d’expiration est un pointeur null , sélectionnez bloquera indéfiniment jusqu’à ce qu’au moins un descripteur réponde aux critères spécifiés. Sinon, le délai d’attente pointe vers une structure TIMEVAL qui spécifie la durée maximale pendant laquelle la sélection doit attendre avant de retourner. Lorsque la sélection retourne, le contenu de la structure TIMEVAL n’est pas modifié. Si TIMEVAL est initialisé sur {0, 0}, la sélection retourne immédiatement ; il est utilisé pour interroger l’état des sockets sélectionnés. Si la sélection retourne immédiatement, l’appel de sélection est considéré comme non bloquant et les hypothèses standard pour les appels non bloquants s’appliquent. Par exemple, le crochet de blocage n’est pas appelé et les sockets Windows ne produisent pas.

Note La fonction select n’a aucun effet sur la persistance des événements de socket inscrits auprès de WSAAsyncSelect ou WSAEventSelect.
 
Note Lors de l’émission d’un appel Winsock bloquant tel que select avec le paramètre de délai d’expiration défini sur NULL, Winsock peut avoir besoin d’attendre un événement réseau avant que l’appel puisse se terminer. Winsock effectue une attente alertable 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 a interrompu 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.
 
Windows Phone 8 : cette fonction est prise en charge pour les applications du Store Windows Phone Windows Phone 8 et versions ultérieures.

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

   
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

TIMEVAL

WSAAsyncSelect

WSAEventSelect

Winsock Functions

Référence Winsock

Accepter

connect

Recv

recvfrom

envoyer