LPFN_RIOCREATEREQUESTQUEUE fonction de rappel (mswsock.h)

La fonction RIOCreateRequestQueue crée un descripteur de socket d’E/S inscrit à l’aide d’un socket spécifié et de files d’attente d’achèvement d’E/S à utiliser avec les extensions d’E/S inscrites dans Winsock.

Syntaxe

LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;

RIO_RQ LpfnRiocreaterequestqueue(
  SOCKET Socket,
  ULONG MaxOutstandingReceive,
  ULONG MaxReceiveDataBuffers,
  ULONG MaxOutstandingSend,
  ULONG MaxSendDataBuffers,
  RIO_CQ ReceiveCQ,
  RIO_CQ SendCQ,
  PVOID SocketContext
)
{...}

Paramètres

Socket

Descripteur qui identifie le socket.

MaxOutstandingReceive

Nombre maximal de réceptions en attente autorisées sur le socket.

Ce paramètre est généralement un petit nombre pour la plupart des applications.

MaxReceiveDataBuffers

Nombre maximal de mémoires tampons de données de réception sur le socket.

Notes

Pour Windows 8 et Windows Server 2012 , ce paramètre doit être 1.

MaxOutstandingSend

Nombre maximal d’envois en attente autorisés sur le socket.

MaxSendDataBuffers

Nombre maximal de mémoires tampons de données d’envoi sur le socket.

Notes

Pour Windows 8 et Windows Server 2012 , ce paramètre doit être 1.

ReceiveCQ

Descripteur qui identifie la file d’attente de saisie semi-automatique d’E/S à utiliser pour les achèvements des demandes de réception.

SendCQ

Descripteur qui identifie la file d’attente d’achèvement d’E/S à utiliser pour l’envoi des requêtes.

Ce paramètre peut avoir la même valeur que le paramètre ReceiveCQ .

SocketContext

Contexte de socket à associer à cette file d’attente de requêtes.

Valeur retournée

Si aucune erreur ne se produit, la fonction RIOCreateRequestQueue retourne un descripteur référençant une nouvelle file d’attente de requêtes. Sinon, une valeur de RIO_INVALID_RQ est retournée et un code d’erreur spécifique peut être récupéré en appelant la fonction WSAGetLastError .

Code de retour Description
WSAEINVAL
Un paramètre non valide a été transmis à la fonction.
Cette erreur est retournée si les paramètres ReceiveCQ ou SendCQ contenus RIO_INVALID_CQ. Cette erreur est retournée si les paramètres MaxOutstandingReceive et MaxOutstandingSend sont tous deux zéro. Cette erreur est également retournée si le socket passé dans le paramètre Socket est en cours d’initialisation ou de fermeture.
WSAENOBUFS
La mémoire insuffisante n’a pas pu être allouée. Cette erreur est retournée si la mémoire était insuffisante pour allouer la file d’attente des requêtes en fonction des paramètres. Cette erreur est également retournée si la limite de session réseau a été dépassée.
WSAENOTSOCK
Le descripteur n’est pas un socket. Cette erreur est retournée si le paramètre Socket n’est pas un socket valide.
WSAEOPNOTSUPP
L’opération tentée n’est pas prise en charge pour le type d’objet référencé. Cette erreur est retournée pour un socket dans le paramètre Socket pour un type de socket non pris en charge (SOCK_RAW, par exemple)

Remarques

La fonction RIOCreateRequestQueue crée un descripteur de socket d’E/S inscrit à l’aide d’un socket spécifié et de files d’attente d’achèvement d’E/S. Une application doit appeler RIOCreateRequestQueue pour obtenir un RIO_RQ pour un socket Winsock avant que l’application puisse utiliser les fonctions RIOSend, RIOSendEx, RIOReceive ou RIOReceiveEx . Pour obtenir un RIO_RQ, le socket Winsock doit être associé à des files d’attente d’achèvement pour l’envoi et la réception, bien que la même file d’attente d’achèvement puisse être utilisée pour les deux.

En raison de la taille finie des files d’attente d’achèvement, un socket peut uniquement être associé à une file d’attente d’achèvement pour les opérations d’envoi et de réception s’il garantit de ne pas dépasser la capacité pour le nombre total d’achèvements mis en file d’attente. Par conséquent, des limites spécifiques au socket sont établies par l’appel à la fonction RIOCreateRequestQueue . Ces limites sont utilisées à la fois pendant l’appel RIOCreateRequestQueue pour vérifier l’espace suffisant dans les files d’attente d’achèvement pour prendre en charge les demandes de socket et pendant le temps d’initiation de la demande pour s’assurer que la demande ne provoque pas le dépassement de ses limites par le socket.

Les files d’attente d’envoi et de réception peuvent être associées à plusieurs sockets. Les tailles des files d’attente d’envoi et de réception doivent être supérieures ou égales aux tailles d’envoi et de réception de tous les sockets attachés. À mesure que les files d’attente de requêtes sont fermées en fermant les sockets à l’aide de la fonction closesocket , ces emplacements sont libérés pour être utilisés par d’autres sockets.

Notes

Par souci d’efficacité, l’accès aux files d’attente d’achèvement (RIO_CQ structs) et aux files d’attente de requêtes (RIO_RQ structs) ne sont pas protégés par des primitives de synchronisation. Si vous devez accéder à une file d’attente d’achèvement ou de demandes à partir de plusieurs threads, l’accès doit être coordonné par une section critique, un verrou d’écriture de lecteur mince ou un mécanisme similaire. Ce verrouillage n’est pas nécessaire pour l’accès par un seul thread. Différents threads peuvent accéder à des files d’attente de requêtes/d’achèvement distinctes sans verrous. La synchronisation est nécessaire uniquement lorsque plusieurs threads tentent d’accéder à la même file d’attente. La synchronisation est également nécessaire si plusieurs problèmes de threads envoient et reçoivent sur le même socket, car les opérations d’envoi et de réception utilisent la file d’attente de demandes du socket.

 

Lorsqu’une application a terminé d’utiliser le RIO_RQ, l’application doit appeler la fonction closesocket pour fermer le socket et libérer les ressources associées.

Notes

Le pointeur de fonction vers la fonction RIOCreateRequestQueue doit être obtenu au moment de l’exécution en effectuant un appel à la fonction WSAIoctl avec l’opcode SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER 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 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.

Configuration requise

Condition requise Valeur
En-tête mswsock.h