LPFN_RIOSENDEX funzione di callback (mswsock.h)
La funzione RIOSendEx invia dati di rete su un socket TCP I/O connesso o un socket UDP di I/O associato con opzioni aggiuntive per l'uso con le estensioni di I/O registrate Winsock.
Sintassi
LPFN_RIOSENDEX LpfnRiosendex;
BOOL LpfnRiosendex(
RIO_RQ SocketQueue,
PRIO_BUF pData,
ULONG DataBufferCount,
PRIO_BUF pLocalAddress,
PRIO_BUF pRemoteAddress,
PRIO_BUF pControlContext,
PRIO_BUF pFlags,
DWORD Flags,
PVOID RequestContext
)
{...}
Parametri
SocketQueue
Descrittore che identifica un socket TCP I/O registrato connesso o un socket UDP registrato associato.
pData
Segmento di buffer da un buffer registrato da cui inviare dati. La struttura RIO_BUF puntata da questo parametro può rappresentare una parte di un buffer registrato o un buffer registrato completo.
Questo parametro può essere NULL per un socket UDP I/O registrato associato se l'applicazione non deve inviare un payload di dati nel datagram UDP.
DataBufferCount
Parametro conteggio buffer 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.
pLocalAddress
Questo parametro è riservato e deve essere NULL.
pRemoteAddress
Segmento di buffer da un buffer registrato che in input contiene l'indirizzo remoto a cui inviare i dati di rete.
Questo parametro può essere NULL se il socket è connesso.
pControlContext
Una sezione del buffer che al completamento conterrà informazioni di controllo aggiuntive sull'operazione di invio.
Questo parametro può essere NULL se l'applicazione non vuole ricevere le informazioni di controllo aggiuntive.
pFlags
Una sezione del buffer che al completamento conterrà informazioni aggiuntive sul set di flag per l'operazione di invio.
Questo parametro può essere NULL se l'applicazione non vuole ricevere le informazioni sui flag aggiuntivi.
Flags
Set di flag che modificano il comportamento della funzione RIOSendEx .
Il parametro Flags può contenere una combinazione delle opzioni seguenti, definite nel Mswsockdef.h
file di intestazione:
RIO_MSG_COMMIT_ONLY
Le richieste precedenti aggiunte con il flag di RIO_MSG_DEFER verranno eseguite il commit.
Quando il flag di RIO_MSG_COMMIT_ONLY è impostato, non è possibile specificare altri flag. Quando il flag di RIO_MSG_COMMIT_ONLY è impostato, gli argomenti pData, pLocalAddress, pRemoteAddress, pControlContext, pFlags e RequestContext devono essere NULL e l'argomento DataBufferCount deve essere zero.
Questo flag viene normalmente usato occasionalmente dopo l'emissione di una serie di richieste con il set di flag di RIO_MSG_DEFER . Ciò consente di eliminare la necessità di usare il flag RIO_MSG_DEFER per effettuare l'ultima richiesta senza il flag RIO_MSG_DEFER , che causa il completamento dell'ultima richiesta molto più lentamente di altre richieste.
A differenza di altre chiamate alla funzione RIOSendEx , quando viene impostato il flag RIO_MSG_COMMIT_ONLY , le chiamate alla funzione RIOSendEx non devono essere serializzate. Per una singola RIO_RQ, la funzione RIOSendEx può essere chiamata con RIO_MSG_COMMIT_ONLY su un thread chiamando la funzione RIOSendEx in un altro thread.
RIO_MSG_DONT_NOTIFY
La richiesta non deve attivare la funzione RIONotify quando il completamento della richiesta viene inserito nella coda di completamento.
RIO_MSG_DEFER
La richiesta non deve essere eseguita immediatamente. Verrà inserita la richiesta nella coda della richiesta, ma potrebbe o meno attivare l'esecuzione della richiesta.
L'invio di dati potrebbe essere ritardato fino a quando non viene effettuata una richiesta di invio nel RIO_RQ passato nel parametro SocketQueue senza il set di flag RIO_MSG_DEFER . 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 sulla capacità di I/O in sospeso nel RIO_RQ passato nel parametro SocketQueue , indipendentemente dal fatto che RIO_MSG_DEFER sia impostato.
RequestContext
Contesto della richiesta da associare a questa operazione di invio.
Valore restituito
Se non si verifica alcun errore, la funzione RIOSendEx 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à eseguita 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 di buffer viene deregisterato o viene liberato un buffer per una delle strutture RIO_BUF passate nei parametri prima che l'operazione venga accodata o richiamata. |
WSAEINVAL | Un parametro non valido è stato passato alla funzione. 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 con i parametri. |
WSAENOBUFS | Impossibile allocare memoria sufficiente. Questo errore viene restituito se la coda di completamento di I/O associata al parametro SocketQueue è completa 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 RIOSendEx per inviare dati di rete da qualsiasi buffer completamente contenuto all'interno di un singolo buffer registrato. I membri Offset e Length della struttura RIO_BUF puntati dal parametro pData determinano l'invio dei dati di rete dal buffer.
Il buffer associato a un'operazione di invio non deve essere usato 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 è necessario passare la stessa PRIO_BUF a una richiesta RIOSend(Ex) quando una è già in sospeso. Solo dopo il completamento di una richiesta RIOSend(Ex) in anteprima, è necessario riutilizzare la stessa PRIO_BUF (con lo stesso offset o con un offset e una lunghezza diversi). Inoltre, quando invia dati fa riferimento a un buffer registrato (una parte o l'intero buffer), l'intero buffer registrato non deve essere usato fino al completamento dell'invio. Ciò include l'uso di una parte del buffer registrato per un'operazione di ricezione o di un'altra operazione di invio.
Il parametro pLocalAddress può essere usato per recuperare l'indirizzo locale da cui sono stati inviati i dati. Il parametro pRemoteAddress può essere usato per recuperare l'indirizzo remoto in cui sono stati inviati i dati. Gli indirizzi locali e remoti vengono restituiti come strutture SOCKADDR_INET . Di conseguenza, il membro Length della RIO_BUF puntato da pLocalAddress o pRemoteAddress parametri deve essere uguale o maggiore delle dimensioni di una struttura SOCKADDR_INET.
La tabella seguente riepiloga i vari usi dei dati di controllo disponibili per l'uso con le informazioni sul controllo nel membro pControlContext .
Protocollo | cmsg_level | cmsg_type | Descrizione |
---|---|---|---|
IPv4 | IPPROTO_IP | IP_PKTINFO | Specifica/riceve le informazioni sui pacchetti. Per altre informazioni, vedere opzioni socket IPPROTO_IP per l'opzione socket IP_PKTINFO. |
IPv6 | IPPROTO_IPV6 | IPV6_DSTOPTS | Specifica/riceve le opzioni di destinazione. |
IPv6 | IPPROTO_IPV6 | IPV6_HOPLIMIT | Specifica/riceve il limite di hop. Per altre informazioni, vedere opzioni socket IPPROTO_IPV6 per l'opzione socket IPV6_HOPLIMIT. |
IPv6 | IPPROTO_IPV6 | IPV6_HOPOPTS | Specifica/riceve opzioni hop-by-hop. |
IPv6 | IPPROTO_IPV6 | IPV6_NEXTHOP | Specifica l'indirizzo hop successivo. |
IPv6 | IPPROTO_IPV6 | IPV6_PKTINFO | Specifica/riceve informazioni sui pacchetti. Per altre informazioni, vedere opzioni socket IPPROTO_IPV6 per l'opzione socket IPV6_PKTINFO. |
IPv6 | IPPROTO_IPV6 | IPV6_RTHDR | Specifica/riceve l'intestazione di routing. |
I dati di controllo sono costituiti da uno o più oggetti dati di controllo, ognuno dei quali inizia con una struttura WSACMSGHDR , definita come segue:
} WSACMSGHDR;
I membri della struttura WSACMSGHDR sono i seguenti:
Termine | Descrizione |
---|---|
cmsg_len | Numero di byte di dati a partire dall'inizio di WSACMSGHDR alla fine dei dati (esclusi i byte di spaziatura interna che possono seguire i dati). |
cmsg_level | Protocollo che ha originato le informazioni sul controllo. |
cmsg_type | Tipo specifico del protocollo delle informazioni sul controllo. |
Il parametro Flags può essere usato per influenzare il comportamento della funzione RIOSendEx oltre le 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 RIOSendEx 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 |