Partager via


Exécution des demandes de transfert de données

Le commutateur Windows Sockets transfère des données sur un socket SAN de manière asynchrone. Chaque fois que le commutateur appelle la fonction de transfert de données WSPSend, WSPRecv, WSPRdmaWrite ou WSPRdmaRead du fournisseur de services SAN, il spécifie un pointeur vers une structure superposée (WSAOVERLAPPED) et NULL pour une routine d’achèvement. Même si le commutateur appelle la fonction WSPEventSelect du fournisseur de services SAN pour indiquer que le socket est en mode non bloquant, le fournisseur de services SAN n’est pas tenu d’implémenter la sémantique non bloquante pour ces fonctions de transfert de données.

Comme décrit dans la documentation sur l’API Windows Sockets et SPI de la documentation Microsoft Windows SDK, les sockets bloquants et non bloquants traitent les opérations qui se chevauchent de la même façon. Autrement dit, le fournisseur de services SAN démarre l’opération de transfert de données particulière, puis retourne immédiatement le contrôle au commutateur. Ces fonctions de transfert de données retournent le code d’erreur WSA_IO_PENDING pour indiquer qu’une opération asynchrone a démarré et que l’achèvement de cette opération se produit ultérieurement. Une fois l’opération terminée, le fournisseur de services SAN signale l’achèvement si le commutateur nécessite une notification d’achèvement, comme décrit dans les paragraphes suivants.

Étant donné que le commutateur spécifie toujours NULL pour une routine d’achèvement pour les opérations de transfert de données qui se chevauchent, un fournisseur de services SAN n’est pas tenu de prendre en charge l’achèvement via l’utilisation d’appels de procédure asynchrone (APC).

Dans la mesure du possible, le commutateur tente d’appeler la fonction WSPGetOverlappedResult du fournisseur de services SAN pour interroger l’achèvement des demandes de transfert de données. De cette façon, le commutateur peut éviter la surcharge associée aux mécanismes de saisie semi-automatique qui se chevauchent. Pour indiquer à un fournisseur de services SAN que le commutateur ne nécessite pas de notification d’achèvement pour une opération de transfert de données qui se chevauche, le commutateur définit le bit d’ordre inférieur du membre hEvent dans la structure WSAOVERLAPPED sur un. Le fournisseur de services SAN ne doit pas informer le commutateur de l’achèvement des demandes envoyées de cette manière.

Si le commutateur nécessite une notification de l’achèvement d’une opération de transfert de données qui se chevauche, il définit le bit d’ordre inférieur du membre hEvent dans la structure WSAOVERLAPPED sur zéro. Le fournisseur de services SAN doit effectuer les opérations de transfert de données lancées de cette façon en appelant la fonction WPUCompleteOverlappedRequest pour signaler l’achèvement. Dans cet appel, le fournisseur de services SAN passe un pointeur vers la structure WSAOVERLAPPED qui correspond à une opération de transfert de données terminée. Dans cet appel WPUCompleteOverlappedRequest , le fournisseur de services SAN transmet également le descripteur de socket qui a été acquis à partir du commutateur dans un appel à la fonction WPUCreateSocketHandle . Le commutateur reçoit des notifications d’achèvement, les met en correspondance avec les demandes d’E/S d’une application et termine ces demandes d’E/S, le cas échéant, pour l’application.