Condividi tramite


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