Condividi tramite


LPFN_RIOCREATEREQUESTQUEUE funzione di callback (mswsock.h)

La funzione RIOCreateRequestQueue crea un descrittore socket di I/O registrato usando una coda di completamento di I/O e socket specificata per l'uso con le estensioni di I/O registrate winsock.

Sintassi

LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;

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

Parametri

Socket

Descrittore che identifica il socket.

MaxOutstandingReceive

Numero massimo di ricevute in sospeso consentite sul socket.

Questo parametro è in genere un numero ridotto per la maggior parte delle applicazioni.

MaxReceiveDataBuffers

Numero massimo di buffer di dati di ricezione nel socket.

Nota

Per Windows 8 e Windows Server 2012 , questo parametro deve essere 1.

MaxOutstandingSend

Numero massimo di invii in sospeso consentiti sul socket.

MaxSendDataBuffers

Numero massimo di buffer di dati inviati sul socket.

Nota

Per Windows 8 e Windows Server 2012 , questo parametro deve essere 1.

ReceiveCQ

Descrittore che identifica la coda di completamento di I/O da usare per ricevere i completamenti delle richieste.

SendCQ

Descrittore che identifica la coda di completamento di I/O da usare per inviare i completamenti delle richieste.

Questo parametro può avere lo stesso valore del parametro ReceiveCQ .

SocketContext

Contesto del socket da associare alla coda di richieste.

Valore restituito

Se non si verifica alcun errore, la funzione RIOCreateRequestQueue restituisce un descrittore che fa riferimento a una nuova coda di richieste. In caso contrario, viene restituito un valore di RIO_INVALID_RQ e un codice di errore specifico può essere recuperato chiamando la funzione WSAGetLastError .

Codice restituito Descrizione
WSAEINVAL
Alla funzione è stato passato un parametro non valido.
Questo errore viene restituito se i parametri ReceiveCQ o SendCQ contengono RIO_INVALID_CQ. Questo errore viene restituito se i parametri MaxOutstandingReceive e MaxOutstandingSend sono zero. Questo errore viene restituito anche se il socket passato nel parametro Socket è in fase di inizializzazione o chiusura.
WSAENOBUFS
Impossibile allocare memoria sufficiente. Questo errore viene restituito se la memoria non è sufficiente per allocare la coda delle richieste in base ai parametri. Questo errore viene restituito anche se è stato superato il limite di sessione di rete.
WSAENOTSOCK
Il descrittore non è un socket. Questo errore viene restituito se il parametro Socket non è un socket valido.
WSAEOPNOTSUPP
L'operazione tentata non è supportata per il tipo di oggetto a cui si fa riferimento. Questo errore viene restituito per un socket nel parametro Socket per un tipo di socket non supportato (ad esempio, SOCK_RAW)

Commenti

La funzione RIOCreateRequestQueue crea un descrittore socket I/O registrato usando una coda di completamento di I/O e socket specificata. Un'applicazione deve chiamare RIOCreateRequestQueue per ottenere un RIO_RQ per un socket Winsock prima che l'applicazione possa usare le funzioni RIOSend, RIOSendEx, RIOReceive o RIOReceiveEx . Per ottenere un RIO_RQ, il socket Winsock deve essere associato alle code di completamento per l'invio e la ricezione, anche se la stessa coda di completamento può essere usata per entrambi.

A causa delle dimensioni finite delle code di completamento, un socket può essere associato solo a una coda di completamento per le operazioni di invio e ricezione se garantisce di non superare la capacità per i completamenti in coda totali. Pertanto, i limiti specifici del socket vengono stabiliti dalla chiamata alla funzione RIOCreateRequestQueue . Questi limiti vengono usati sia durante la chiamata RIOCreateRequestQueue per verificare spazio sufficiente nelle code di completamento per soddisfare le richieste socket e durante il tempo di avvio della richiesta per assicurarsi che la richiesta non superi i limiti.

Le code di invio e ricezione possono essere associate a più socket. Le dimensioni delle code di invio e ricezione devono essere maggiori o uguali alle dimensioni di invio e ricezione di tutti i socket collegati. Poiché le code delle richieste vengono chiuse chiudendo i socket usando la funzione closesocket , tali slot verranno liberati per l'uso da parte di altri socket.

Nota

Ai fini dell'efficienza, l'accesso alle code di completamento (struct RIO_CQ ) e alle code delle richieste (RIO_RQ struct) non sono protetti dalle primitive di sincronizzazione. Se è necessario accedere a una coda di completamento o richiesta da più thread, l'accesso deve essere coordinato da una sezione critica, un blocco di scrittura di lettura sottile o un meccanismo simile. Questo blocco non è necessario per l'accesso da un singolo thread. I thread diversi possono accedere a code di completamento/richieste separate senza blocchi. La necessità di sincronizzazione si verifica solo quando più thread tentano di accedere alla stessa coda. La sincronizzazione è necessaria anche se più thread invia e riceve sullo stesso socket perché le operazioni di invio e ricezione usano la coda di richieste del socket.

 

Al termine dell'utilizzo del RIO_RQ, l'applicazione deve chiamare la funzione closesocket per chiudere il socket e liberare le risorse associate.

Nota

Il puntatore di funzione alla funzione RIOCreateRequestQueue deve essere ottenuto in fase di esecuzione effettuando una chiamata alla funzione WSAIoctl con il codice operativo SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER specificato. Il buffer di input passato alla funzione WSAIoctl deve contenere WSAID_MULTIPLE_RIO, un identificatore univoco globale (GUID) il cui valore identifica le funzioni di estensione I/O registrate winsock. In caso di esito positivo, l'output restituito dalla funzione WSAIoctl contiene un puntatore alla struttura RIO_EXTENSION_FUNCTION_TABLE che contiene puntatori alle funzioni di estensione di I/O registrate winsock. Il SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL è definito nel file di intestazione Ws2def.h . Il GUID WSAID_MULTIPLE_RIO è definito nel file di intestazione Mswsock.h .

 

Windows Phone 8: questa funzione è supportata per le app dello Store di Windows Phone in Windows Phone 8 e versioni successive.

Windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.

Requisiti

Requisito Valore
Intestazione mswsock.h