Partager via


Objets d’E/S et d’événements qui se chevauchent

Windows Sockets 2 prend en charge les E/S qui se chevauchent et tous les fournisseurs de transport prennent en charge cette fonctionnalité. Les E/S qui se chevauchent suivent le modèle établi dans Windows et peuvent être effectuées sur des sockets créés avec la fonction socket ou des sockets créés avec la fonction WSASocket avec l’indicateur WSA_FLAG_OVERLAPPED défini dans le paramètre dwFlags .

Notes

La création d’un socket avec l’attribut superposé n’a aucun impact sur le fait qu’un socket soit actuellement en mode bloquant ou non bloquant. Les sockets créés avec l’attribut superposé 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 qui se chevauchent ne se bloquent pas, le mode de blocage d’un socket n’est pas pertinent pour ces opérations.

 

Pour la réception, 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 dans les mémoires tampons de l’utilisateur dès qu’elles arrivent. Ainsi, elle peut éviter l’opération de copie qui se produirait au moment où la fonction recv ou recvfrom est appelée. Si des données sont déjà présentes lors de la publication des mémoires tampons de réception, elles sont copiées immédiatement dans les mémoires tampons de l’utilisateur.

Si des données arrivent quand aucune mémoire tampon de réception n’a été publiée par l’application, le réseau a recours au style de fonctionnement 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 à cela est lorsque l’application utilise setsockopt pour définir la taille de la mémoire tampon de réception sur zéro. Dans cette instance, les protocoles fiables n’autorisent la réception de données que lorsque des mémoires tampons d’application ont été publiées et que les données sur les protocoles non fiables sont perdues.

Du côté de l’envoi, les applications utilisent WSASend ou WSASendTo pour fournir des pointeurs vers des mémoires tampons remplies, puis acceptent de ne pas déranger les mémoires tampons de quelque manière que ce soit tant que le réseau n’a pas consommé le contenu de la mémoire tampon.

Les appels d’envoi et de réception qui se chevauchent retournent immédiatement. Une valeur de retour égale à 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 passe à l’état d’attente pouvant être alerté.

Une valeur de retour de SOCKET_ERROR associée à un code d’erreur de WSA_IO_PENDING indique que l’opération superposée a été correctement lancée et qu’une indication ultérieure sera fournie lorsque les mémoires tampons d’envoi auront été consommées ou lorsqu’une opération de réception est terminée. Toutefois, pour les sockets de style de flux d’octets, l’indication d’achèvement se produit chaque fois que les données entrantes sont épuisées, que les mémoires tampons soient saturées ou non. Tout autre code d’erreur indique que l’opération superposée n’a pas été correctement lancée et qu’aucune indication d’achèvement ne sera disponible.

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 qui se chevauchent à l’aide de AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile et des 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 finira par interrompre 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 d’ioctlsocket.