LPFN_RIOSEND fonction de rappel (mswsock.h)
La fonction RIOSend envoie des données réseau sur un socket TCP d’E/S inscrit connecté ou un socket UDP d’E/S inscrit lié pour une utilisation avec les extensions d’E/S inscrites winsock.
Syntaxe
LPFN_RIOSEND LpfnRiosend;
BOOL LpfnRiosend(
RIO_RQ SocketQueue,
PRIO_BUF pData,
ULONG DataBufferCount,
DWORD Flags,
PVOID RequestContext
)
{...}
Paramètres
SocketQueue
Descripteur qui identifie un socket TCP d’E/S inscrit connecté ou un socket UDP d’E/S inscrit lié.
pData
Description de la partie de la mémoire tampon inscrite à partir de laquelle envoyer des données.
Ce paramètre peut avoir la valeur NULL pour un socket UDP d’E/S inscrit lié si l’application n’a pas besoin d’envoyer une charge utile de données dans le datagramme UDP.
DataBufferCount
Paramètre de nombre de mémoires tampons de données qui indique si les données doivent être envoyées dans la mémoire tampon pointée par le paramètre pData .
Ce paramètre doit être défini sur zéro si pData a la valeur NULL. Sinon, ce paramètre doit être défini sur 1.
Flags
Ensemble d’indicateurs qui modifient le comportement de la fonction RIOSend .
Le paramètre Flags peut contenir une combinaison des options suivantes, définies dans le fichier d’en-tête Mswsockdef.h
:
RIO_MSG_COMMIT_ONLY
Les demandes précédentes ajoutées avec RIO_MSG_DEFER indicateur seront validées.
Lorsque l’indicateur RIO_MSG_COMMIT_ONLY est défini, aucun autre indicateur ne peut être spécifié. Lorsque l’indicateur RIO_MSG_COMMIT_ONLY est défini, les arguments pData et RequestContext doivent avoir la valeur NULL et l’argument DataBufferCount doit être égal à zéro.
Cet indicateur est normalement utilisé occasionnellement après l’émission d’un certain nombre de demandes avec le jeu d’indicateurs RIO_MSG_DEFER . Cela élimine la nécessité lors de l’utilisation de l’indicateur RIO_MSG_DEFER d’effectuer la dernière requête sans l’indicateur RIO_MSG_DEFER , ce qui entraîne l’opération de la dernière requête beaucoup plus lentement que les autres demandes.
Contrairement à d’autres appels à la fonction RIOSend , lorsque l’indicateur RIO_MSG_COMMIT_ONLY est défini, les appels à la fonction RIOSend n’ont pas besoin d’être sérialisés. Pour une seule RIO_RQ, la fonction RIOSend peut être appelée avec RIO_MSG_COMMIT_ONLY sur un thread lors de l’appel de la fonction RIOSend sur un autre thread.
RIO_MSG_DONT_NOTIFY
La demande ne doit pas déclencher la fonction RIONotify lorsque l’achèvement de la demande est inséré dans sa file d’attente d’achèvement.
RIO_MSG_DEFER
La demande n’a pas besoin d’être exécutée immédiatement. Cela permet d’insérer la requête dans la file d’attente des requêtes, mais cela peut déclencher ou non l’exécution de la demande.
L’envoi de données peut être retardé jusqu’à ce qu’une demande d’envoi soit effectuée sur le RIO_RQ passé dans le paramètre SocketQueue sans le jeu d’indicateurs RIO_MSG_DEFER . Pour déclencher l’exécution de tous les envois dans une file d’attente d’envoi, appelez la fonction RIOSend ou RIOSendEx sans l’indicateur RIO_MSG_DEFER défini.
Notes
La demande d’envoi est facturée sur la capacité d’E/S restante sur le RIO_RQ passée dans le paramètre SocketQueue , que RIO_MSG_DEFER soit défini ou non.
RequestContext
Valeur retournée
Si aucune erreur ne se produit, la fonction RIOSend retourne TRUE. Dans ce cas, l’opération d’envoi est correctement lancée et l’achèvement a déjà été mis en file d’attente ou l’opération a été lancée avec succès et l’achèvement sera mis en file d’attente ultérieurement.
La valeur FALSE indique que la fonction a échoué, que l’opération n’a pas été lancée et qu’aucune indication d’achèvement n’est mise en file d’attente. Un code d’erreur spécifique peut être récupéré en appelant la fonction WSAGetLastError .
Code de retour | Description |
---|---|
WSAEFAULT | Le système a détecté une adresse de pointeur non valide lors de la tentative d’utilisation d’un argument pointeur dans un appel. Cette erreur est retournée si un identificateur de mémoire tampon est désinscrit ou si une mémoire tampon est libérée pour l’une des structures RIO_BUF passées dans les paramètres avant que l’opération ne soit mise en file d’attente ou appelée. |
WSAEINVAL | Un paramètre non valide a été transmis à la fonction. Cette erreur est retournée si le paramètre SocketQueue n’est pas valide, si le paramètre Flags contient une valeur non valide pour une opération d’envoi ou si l’intégrité de la file d’attente d’achèvement a été compromise. Cette erreur peut également être retournée pour d’autres problèmes liés aux paramètres. |
WSAENOBUFS | Une mémoire suffisante n’a pas pu être allouée. Cette erreur est retournée si la file d’attente d’achèvement des E/S associée au paramètre SocketQueue est pleine ou si la file d’attente d’achèvement des E/S a été créée avec zéro entrée d’envoi. |
WSA_IO_PENDING | L’opération a été lancée avec succès et l’achèvement sera mis en file d’attente ultérieurement. |
Remarques
Une application peut utiliser la fonction RIOSend pour envoyer des données réseau à partir de n’importe quelle mémoire tampon entièrement contenue dans une mémoire tampon inscrite unique. Les membres Offset et Length de la structure RIO_BUF pointées par le paramètre pData déterminent les données réseau à envoyer à partir de la mémoire tampon.
La mémoire tampon associée à une opération d’envoi ne doit pas être utilisée simultanément avec une autre opération d’envoi ou de réception. La mémoire tampon et l’inscription de la mémoire tampon doivent rester valides pendant la durée d’une opération d’envoi. Cela signifie que vous ne devez pas passer les mêmes PRIO_BUF à une requête RIOSend(Ex) quand une requête est déjà en attente. Une fois qu’une demande RIOSend(Ex) en cours d’exécution est terminée, vous devez réutiliser les mêmes PRIO_BUF (avec le même décalage ou avec un décalage et une longueur différents). En outre, lorsque l’envoi de données fait référence à une mémoire tampon inscrite (une partie ou la mémoire tampon entière), l’intégralité de la mémoire tampon inscrite ne doit pas être utilisée tant que l’envoi n’est pas terminé. Cela inclut l’utilisation d’une partie de la mémoire tampon inscrite pour une opération de réception ou une autre opération d’envoi.
Le paramètre Flags peut être utilisé pour influencer le comportement de la fonction RIOSend au-delà des options spécifiées pour le socket associé. Le comportement de cette fonction est déterminé par une combinaison d’options de socket définies sur le socket associé au paramètre SocketQueue et les valeurs spécifiées dans le paramètre Flags .
Notes
Le pointeur de fonction vers la fonction RIOSend doit être obtenu au moment de l’exécution en appelant la fonction WSAIoctl avec le SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode spécifié. La mémoire tampon d’entrée passée à la fonction WSAIoctl doit contenir WSAID_MULTIPLE_RIO, un identificateur global unique (GUID) dont la valeur identifie les fonctions d’extension d’E/S inscrites dans Winsock. En cas de réussite, la sortie retournée par la fonction WSAIoctl contient un pointeur vers la structure RIO_EXTENSION_FUNCTION_TABLE qui contient des pointeurs vers les fonctions d’extension d’E/S inscrites dans Winsock. Le SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL est défini dans le fichier d’en-tête Ws2def.h . Le GUID WSAID_MULTIPLE_RIO est défini dans le fichier d’en-tête Mswsock.h .
Windows Phone 8 : cette fonction est prise en charge pour les applications du Store Windows Phone 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.
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | mswsock.h |