Oggetti di I/O sovrapposti e eventi

Windows Sockets 2 supporta l'I/O sovrapposto e tutti i provider di trasporto supportano questa funzionalità. L'I/O sovrapposto segue il modello stabilito in Windows e può essere eseguito nei socket creati con la funzione socket o i socket creati con la funzione WSASocket con il flag WSA_FLAG_OVERLAPPED impostato nel parametro dwFlags .

Nota

La creazione di un socket con l'attributo sovrapposto non ha alcun impatto sul fatto che un socket sia attualmente in modalità di blocco o non di blocco. I socket creati con l'attributo sovrapposto possono essere usati per eseguire operazioni di I/O sovrapposte, in modo da non modificare la modalità di blocco di un socket. Poiché le operazioni di I/O sovrapposte non bloccano, la modalità di blocco di un socket è irrilevante per queste operazioni.

 

Per la ricezione, le applicazioni usano le funzioni WSARecv o WSARecvFrom per fornire buffer in cui ricevere i dati. Se uno o più buffer vengono pubblicati prima dell'ora in cui i dati sono stati ricevuti dalla rete, tali dati potrebbero essere inseriti nei buffer dell'utente immediatamente quando arriva. Pertanto, può evitare l'operazione di copia che altrimenti si verifica al momento in cui viene richiamata la funzione recv o recvfrom. Se i dati sono già presenti quando vengono pubblicati i buffer di ricezione, viene copiato immediatamente nei buffer dell'utente.

Se i dati arrivano quando non sono stati pubblicati buffer di ricezione dall'applicazione, la rete si applica allo stile sincrono familiare dell'operazione. Ovvero, i dati in ingresso vengono memorizzati internamente nel buffer finché l'applicazione genera una chiamata di ricezione e quindi fornisce un buffer in cui è possibile copiare i dati. Un'eccezione è quando l'applicazione usa setockopt per impostare le dimensioni del buffer di ricezione su zero. In questa istanza, i protocolli affidabili consentono la ricezione dei dati solo quando i buffer dell'applicazione erano stati pubblicati e i dati sui protocolli non affidabili sarebbero persi.

Sul lato invio, le applicazioni usano WSASend o WSASendTo per fornire puntatori ai buffer riempiti e quindi accettare di non disturbare i buffer in alcun modo finché la rete non ha usato il contenuto del buffer.

L'invio sovrapposto e la ricezione delle chiamate restituiscono immediatamente. Un valore restituito pari a zero indica che l'operazione di I/O è stata completata immediatamente e che l'indicazione di completamento corrispondente si è già verificata. Ovvero, l'oggetto evento associato è stato segnalato o una routine di completamento è stata accodata e verrà eseguita quando il thread chiamante entra nello stato di attesa avvisabile.

Un valore restituito di SOCKET_ERROR associato a un codice di errore di WSA_IO_PENDING indica che l'operazione sovrapposta è stata avviata correttamente e che un'indicazione successiva verrà fornita quando sono stati utilizzati buffer di invio o quando è stata completata un'operazione di ricezione. Tuttavia, per i socket in stile byte-stream, l'indicazione di completamento si verifica ogni volta che i dati in ingresso vengono esauriti, indipendentemente dal fatto che i buffer siano completi. Qualsiasi altro codice di errore indica che l'operazione sovrapposta non è stata avviata correttamente e che non verrà visualizzata alcuna indicazione di completamento.

Le operazioni di invio e ricezione possono essere sovrapposte. Le funzioni di ricezione possono essere richiamate più volte per pubblicare i buffer di ricezione in preparazione per i dati in ingresso e le funzioni di invio possono essere richiamate più volte in coda più buffer da inviare. Anche se l'applicazione può basarsi su una serie di buffer di invio sovrapposti inviati nell'ordine fornito, le indicazioni di completamento corrispondenti potrebbero verificarsi in un ordine diverso. Analogamente, sul lato ricevente, i buffer possono essere compilati nell'ordine specificato, ma le indicazioni di completamento potrebbero verificarsi in un ordine diverso.

In molti casi, le operazioni sovrapposte di Winsock tramite AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile e le funzioni simili sono annullabili. Tuttavia, il comportamento non è definito per l'uso continuo di un socket che ha annullato operazioni in sospeso. La funzione closesocket deve essere chiamata dopo l'annullamento di un'operazione sovrapposta. Pertanto, per ottenere risultati ottimali, invece di annullare direttamente l'I/O, la funzione closesocket deve essere chiamata per chiudere il socket che alla fine interromperà tutte le operazioni in sospeso.

La funzionalità di completamento posticipata di I/O sovrapposta è disponibile anche per WSAIoctl, che è una versione avanzata di ioctlsocket.