Partager via


select, fonction (winsock2.h)

La fonction select détermine l’état d’un ou plusieurs sockets, en attente si nécessaire, pour 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 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 Meaning
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAEFAULT
L’implémentation de Windows Sockets n’a pas pu allouer les ressources nécessaires pour ses opérations internes, ou les données readfds, writefds, exceptfds ou timeval parameters ne font pas partie de l’espace d’adressage utilisateur.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAEINVAL
WSAEINVAL est retourné si la valeur de délai d’attente n’est pas valide, ou si les trois paramètres de descripteur sont des pointeurs Null ou des pointeurs valides vers des structures vides fd_set contenant aucun socket.
WSAEINTR
Un appel Windows Socket 1.1 bloquant a été annulé via WSACancelBlockingCall.
WSAEINPROGRESS
Un appel Windows Sockets 1.1 bloquant 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 l’état d’un ou plusieurs sockets. Pour chaque socket, l’appelant peut demander des informations sur l’état de lecture, d’écriture ou d’erreur. L’ensemble de sockets pour lesquels un état donné est demandé est indiqué par une structure fd_set . Les sockets contenus dans les structures fd_set doivent être associés à un seul fournisseur de services. 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 . Lors du 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.

Les readfds de paramètre identifient les sockets à vérifier pour la lisibilité. Si le socket est actuellement dans l’état d’écoute , il est marqué comme lisible si une demande de connexion entrante a été reçue de telle sorte qu’une acceptation soit garantie de se terminer sans bloquer. Pour les autres sockets, la lisibilité signifie que les données mises en file d’attente sont disponibles pour la lecture afin qu’un appel à recv, WSARecv, WSARecvFrom ou recvfrom ne soit 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 rév retourne immédiatement avec zéro octets lus. Si le circuit virtuel a été réinitialisé, une rév 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).

Les écritures de paramètre identifient les sockets à vérifier pour la facilité d’écriture. Si un socket traite un appel de connexion (non bloquant), un socket est accessible en écriture si l’établissement de connexion se termine correctement. Si le socket n’est pas en cours de traitement d’un appel de connexion, l’écriture signifie qu’un envoi, un sendto ou WSASendto est garanti pour réussir. Toutefois, ils peuvent bloquer sur un socket bloquant si le paramètre len dépasse la quantité d’espace tampon système sortant disponible. Il n’est pas spécifié combien de temps 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 toute condition d’erreur exceptionnelle.

Note Les données hors bande ne sont signalées de cette façon que si l’option SO_OOBINLINE a la valeur FALSE. Si un socket traite un appel de connexion (non bloquant), l’échec de la tentative de connexion est indiqué dans sauffds (l’application doit ensuite appeler getsockopt SO_ERROR pour déterminer la valeur d’erreur pour décrire pourquoi l’échec s’est produit). 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 une doit être non null, et tout jeu de descripteur non null doit contenir au moins un handle sur un socket.

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

readfds :

  • Si l’écoute a été appelée et qu’une connexion est en attente, l’acceptation réussit.
  • Les données sont disponibles pour la lecture (inclut les données OOB si SO_OOBINLINE est activée).
  • La connexion a été fermée/réinitialisée/terminée.
writefds :
  • Si vous traitez un appel de connexion (non bloquant), la connexion a réussi.
  • Les données peuvent être envoyées.
sauffds :
  • Si vous traitez un appel de connexion (sans blocage), la tentative de connexion a échoué.
  • Les données OOB sont disponibles pour la lecture (uniquement si SO_OOBINLINE est désactivée).
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 jeu. (La valeur par défaut de FD_SETSIZE est 64, qui peut être modifiée en définissant FD_SETSIZE sur une autre valeur avant d’inclure Winsock2.h.) En interne, les handles de socket dans une structure 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 à vérifier fd_set contenu sont les suivantes :
  • FD_ZERO(*set) : initialise le jeu 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 s’il s’agit d’un membre d’un jeu et retourne TRUE si c’est le cas.
  • FD_SET(s, *set) : ajoute des sockets à définir.

Le délai d’expiration du paramètre contrôle la durée pendant laquelle la sélection peut prendre. Si le délai d’attente est un pointeur Null , la sélection se bloque 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 est retournée, le contenu de la structure TIMEVAL n’est pas modifié. Si TIMEVAL est initialisé sur {0, 0}, sélectionnez retourner immédiatement ; permet d’interroger l’état des sockets sélectionnés. Si la sélection retourne immédiatement, l’appel select est considéré comme non bloquant et les hypothèses standard pour les appels non bloquants s’appliquent. Par exemple, le hook bloquant ne sera 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 la sélection 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 Windows Phone Store sur 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.

Spécifications

Requirement Valeur
Client minimum requis 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 Fenêtres
Header winsock2.h
Library Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

TIMEVAL

WSAAsyncSelect

WSAEventSelect

Fonctions Winsock

Référence Winsock

accepter

connect

recv

recvfrom

Envoyer