LPFN_RIOSEND funzione di callback (mswsock.h)
La funzione RIOSend invia dati di rete su un socket TCP I/O registrato connesso o un socket UDP di I/O registrato associato per l'uso con le estensioni di I/O registrate winsock.
Sintassi
LPFN_RIOSEND LpfnRiosend;
BOOL LpfnRiosend(
RIO_RQ SocketQueue,
PRIO_BUF pData,
ULONG DataBufferCount,
DWORD Flags,
PVOID RequestContext
)
{...}
Parametri
SocketQueue
Descrittore che identifica un socket TCP di I/O registrato connesso o un socket UDP di I/O registrato associato.
pData
Descrizione della parte del buffer registrato da cui inviare dati.
Questo parametro può essere NULL per un socket UDP di I/O registrato associato se l'applicazione non deve inviare un payload di dati nel datagramma UDP.
DataBufferCount
Parametro del conteggio del buffer dei dati che indica se i dati devono essere inviati nel buffer a cui punta il parametro pData .
Questo parametro deve essere impostato su zero se pData è NULL. In caso contrario, questo parametro deve essere impostato su 1.
Flags
Set di flag che modificano il comportamento della funzione RIOSend .
Il parametro Flags può contenere una combinazione delle opzioni seguenti, definite nel Mswsockdef.h
file di intestazione:
RIO_MSG_COMMIT_ONLY
Verrà eseguito il commit delle richieste precedenti aggiunte con RIO_MSG_DEFER flag.
Quando il flag RIO_MSG_COMMIT_ONLY è impostato, non è possibile specificare altri flag. Quando il flag RIO_MSG_COMMIT_ONLY è impostato, gli argomenti pData e RequestContext devono essere NULL e l'argomento DataBufferCount deve essere zero.
Questo flag viene in genere usato occasionalmente dopo l'emissione di una serie di richieste con il flag RIO_MSG_DEFER impostato. In questo modo si elimina la necessità di usare il flag di RIO_MSG_DEFER per effettuare l'ultima richiesta senza il flag RIO_MSG_DEFER , causando il completamento dell'ultima richiesta molto più lentamente rispetto ad altre richieste.
A differenza di altre chiamate alla funzione RIOSend , quando il flag RIO_MSG_COMMIT_ONLY è impostato, non è necessario serializzare le chiamate alla funzione RIOSend . Per una singola RIO_RQ, è possibile chiamare la funzione RIOSend con RIO_MSG_COMMIT_ONLY in un thread chiamando la funzione RIOSend in un altro thread.
RIO_MSG_DONT_NOTIFY
La richiesta non deve attivare la funzione RIONotify quando il completamento della richiesta viene inserito nella relativa coda di completamento.
RIO_MSG_DEFER
La richiesta non deve essere eseguita immediatamente. La richiesta verrà inserita nella coda delle richieste, ma potrebbe attivare o meno l'esecuzione della richiesta.
L'invio di dati potrebbe essere ritardato fino a quando non viene effettuata una richiesta di invio sul RIO_RQ passato nel parametro SocketQueue senza il flag RIO_MSG_DEFER impostato. Per attivare l'esecuzione di tutti gli invii in una coda di invio, chiamare la funzione RIOSend o RIOSendEx senza il flag RIO_MSG_DEFER impostato.
Nota
La richiesta di invio viene addebitata in base alla capacità di I/O in sospeso nel RIO_RQ passato nel parametro SocketQueue , indipendentemente dal fatto che RIO_MSG_DEFER sia impostato.
RequestContext
Valore restituito
Se non si verifica alcun errore, la funzione RIOSend restituisce TRUE. In questo caso, l'operazione di invio viene avviata correttamente e il completamento sarà già stato accodato o l'operazione è stata avviata correttamente e il completamento verrà accodato in un secondo momento.
Un valore FALSE indica che la funzione non è riuscita, l'operazione non è stata avviata correttamente e non verrà accodata alcuna indicazione di completamento. È possibile recuperare un codice di errore specifico chiamando la funzione WSAGetLastError .
Codice restituito | Descrizione |
---|---|
WSAEFAULT | Il sistema ha rilevato un indirizzo puntatore non valido nel tentativo di usare un argomento puntatore in una chiamata. Questo errore viene restituito se un identificatore del buffer viene deregisterato o se un buffer viene liberato per una delle strutture RIO_BUF passate nei parametri prima che l'operazione venga accodata o richiamata. |
WSAEINVAL | Alla funzione è stato passato un parametro non valido. Questo errore viene restituito se il parametro SocketQueue non è valido, il parametro Flags contiene un valore non valido per un'operazione di invio o l'integrità della coda di completamento è stata compromessa. Questo errore può essere restituito anche per altri problemi relativi ai parametri. |
WSAENOBUFS | Impossibile allocare memoria sufficiente. Questo errore viene restituito se la coda di completamento di I/O associata al parametro SocketQueue è piena o la coda di completamento di I/O è stata creata con zero voci di invio. |
WSA_IO_PENDING | L'operazione è stata avviata correttamente e il completamento verrà accodato in un secondo momento. |
Commenti
Un'applicazione può usare la funzione RIOSend per inviare i dati di rete da qualsiasi buffer completamente contenuto all'interno di un singolo buffer registrato. I membri Offset e Length della struttura RIO_BUF a cui punta il parametro pData determinano i dati di rete da inviare dal buffer.
Il buffer associato a un'operazione di invio non deve essere utilizzato simultaneamente con un'altra operazione di invio o ricezione. Il buffer e la registrazione del buffer devono rimanere validi per la durata di un'operazione di invio. Ciò significa che non è consigliabile passare lo stesso PRIO_BUF a una richiesta RIOSend(Ex) quando ne è già in sospeso uno. Solo dopo il completamento di una richiesta RIOSend(Ex) in corso, è necessario riutilizzare lo stesso PRIO_BUF (con lo stesso offset o con un offset e una lunghezza diversi). Inoltre, quando l'invio di dati fa riferimento a un buffer registrato (una parte o l'intero buffer), l'intero buffer registrato non deve essere utilizzato fino al completamento dell'invio. Ciò include l'uso di una parte del buffer registrato per un'operazione di ricezione o un'altra operazione di invio.
Il parametro Flags può essere usato per influenzare il comportamento della funzione RIOSend oltre alle opzioni specificate per il socket associato. Il comportamento di questa funzione è determinato da una combinazione di qualsiasi opzione socket impostata sul socket associato al parametro SocketQueue e ai valori specificati nel parametro Flags .
Nota
Il puntatore di funzione alla funzione RIOSend 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 |