Objets d’E/S et d’événements superposés
Windows Sockets 2 prend en charge les E/S superposées et tous les fournisseurs de transport prennent en charge cette fonctionnalité. Les E/S superposées suivent le modèle établi dans Windows et peuvent être effectués sur les sockets créés avec la fonctionde socketou les sockets créés avec la fonction WSASocket avec l’indicateur de WSA_FLAG_OVERLAPPED défini dans le paramètre dwFlags.
Note
La création d’un socket avec l’attribut qui se chevauche n’a aucun impact sur l’absence de blocage ou de blocage d’un socket. Les sockets créés avec l’attribut qui se chevauchent peuvent être utilisés pour effectuer des E/S qui se chevauchent, ce qui ne modifie pas le mode de blocage d’un socket. Étant donné que les opérations d’E/S se chevauchent ne bloquent pas, le mode de blocage d’un socket n’est pas pertinent pour ces opérations.
Pour recevoir, les applications utilisent les fonctions WSARecv ou WSARecvFrom pour fournir des mémoires tampons dans lesquelles les données doivent être reçues. Si une ou plusieurs mémoires tampons sont publiées avant l’heure à laquelle les données ont été reçues par le réseau, ces données peuvent être placées immédiatement dans les mémoires tampons de l’utilisateur dès qu’elles arrivent. Ainsi, il peut éviter l’opération de copie qui se produirait autrement au moment où la recv ou recvfrom fonction est appelée. Si les données sont déjà présentes lorsque des mémoires tampons de réception sont publiées, elles sont copiées immédiatement dans les mémoires tampons de l’utilisateur.
Si les données arrivent lorsqu’aucune mémoire tampon de réception n’a été publiée par l’application, le réseau se limite au style d’opération synchrone familier. Autrement dit, les données entrantes sont mises en mémoire tampon en interne jusqu’à ce que l’application émet un appel de réception et fournisse ainsi une mémoire tampon dans laquelle les données peuvent être copiées. Une exception à ceci est lorsque l’application utilise setsockopt pour définir la taille de la mémoire tampon de réception sur zéro. Dans ce cas, les protocoles fiables autorisent uniquement la réception des données lorsque les mémoires tampons d’application avaient été publiées et que les données sur des protocoles non fiables seraient perdues.
Côté envoi, les applications utilisent WSASend ou WSASendTo pour fournir des pointeurs à des mémoires tampons remplies, puis accepter de ne pas déranger les mémoires tampons tant que le réseau n’a pas consommé le contenu de la mémoire tampon.
Les appels envoyés et reçus se chevauchent immédiatement. Une valeur de retour de zéro indique que l’opération d’E/S a été effectuée immédiatement et que l’indication d’achèvement correspondante s’est déjà produite. Autrement dit, l’objet d’événement associé a été signalé, ou une routine d’achèvement a été mise en file d’attente et sera exécutée lorsque le thread appelant devient dans l’état d’attente alertable.
Une valeur de retour de SOCKET_ERROR couplée à un code d’erreur de WSA_IO_PENDING indique que l’opération qui se chevauche a été lancée avec succès et qu’une indication ultérieure sera fournie lorsque les mémoires tampons d’envoi ont été consommées ou lorsqu’une opération de réception a été terminée. Toutefois, pour les sockets qui sont un style de flux d’octets, l’indication de saisie semi-automatique se produit chaque fois que les données entrantes sont épuisées, que les mémoires tampons soient pleines. Tout autre code d’erreur indique que l’opération qui se chevauche n’a pas été lancée avec succès et qu’aucune indication d’achèvement n’est à venir.
Les opérations d’envoi et de réception peuvent se chevaucher. Les fonctions de réception peuvent être appelées plusieurs fois pour publier des mémoires tampons de réception en préparation des données entrantes, et les fonctions d’envoi peuvent être appelées plusieurs fois pour mettre en file d’attente plusieurs mémoires tampons à envoyer. Bien que l’application puisse s’appuyer sur une série de mémoires tampons d’envoi superposées envoyées dans l’ordre fourni, les indications d’achèvement correspondantes peuvent se produire dans un ordre différent. De même, côté réception, les mémoires tampons peuvent être remplies dans l’ordre dans lequel elles sont fournies, mais les indications d’achèvement peuvent se produire dans un ordre différent.
Dans de nombreux cas, les opérations Winsock se chevauchent à l’aide de AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFileet les fonctions similaires sont annulables. Toutefois, le comportement n’est pas défini pour l’utilisation continue d’un socket qui a annulé les opérations en attente. La fonction closesocket doit être appelée après l’annulation d’une opération qui se chevauche. Par conséquent, pour de meilleurs résultats, au lieu d’annuler directement les E/S, la fonction closesocket doit être appelée pour fermer le socket, ce qui interrompt finalement toutes les opérations en attente.
La fonctionnalité d’achèvement différée des E/S superposées est également disponible pour WSAIoctl, qui est une version améliorée de ioctlsocket.