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 |
---|---|
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction. | |
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. | |
Le sous-système réseau a échoué. | |
La valeur de délai d’attente n’est pas valide ou les trois paramètres de descripteur étaient null. | |
Un appel bloquant Windows Socket 1.1 a été annulé via WSACancelBlockingCall. | |
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel. | |
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.
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.
- Si le traitement d’un appel de connexion (sans blocage), la connexion a réussi.
- Les données peuvent être envoyées.
- 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é).
- 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.
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 |