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 |
---|---|
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. |
|
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. |
|
Il descrittore non è un socket. Questo errore viene restituito se il parametro Socket non è un socket valido. |
|
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 |