Oggetti eventi e I/O sovrapposti
Windows Sockets 2 supporta le operazioni di I/O sovrapposte e tutti i provider di trasporto supportano questa funzionalità. L'I/O sovrapposto segue il modello stabilito in Windows e può essere eseguito sui socket creati con la funzione o i socketsocketcreati con la funzione di 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 bloccante. 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 vengono bloccate, la modalità di blocco di un socket è irrilevante per queste operazioni.
Per la ricezione, le applicazioni usano laWSARecvo funzioni WSARecvFrom per fornire buffer in cui devono essere ricevuti i dati. Se uno o più buffer vengono pubblicati prima del momento in cui i dati sono stati ricevuti dalla rete, tali dati potrebbero essere inseriti nei buffer dell'utente immediatamente all'arrivo. Pertanto, può evitare l'operazione di copia che altrimenti si verifica al momento in cui viene richiamata lao recvfrom funzione. Se i dati sono già presenti quando vengono inseriti buffer di ricezione, vengono copiati immediatamente nei buffer dell'utente.
Se i dati arrivano quando non sono stati inseriti buffer di ricezione dall'applicazione, la rete ricorre allo stile sincrono familiare dell'operazione. Ovvero, i dati in ingresso vengono memorizzati internamente nel buffer finché l'applicazione non rilascia 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 questo caso, i protocolli reliable consentono la ricezione dei dati solo quando i buffer dell'applicazione sono stati pubblicati e i dati sui protocolli non affidabili andrebbero persi.
Sul lato di 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 utilizzato il contenuto del buffer.
Le chiamate di invio e ricezione sovrapposte restituiscono immediatamente. Un valore restituito pari a zero indica che l'operazione di I/O è stata completata immediatamente e che si è già verificata l'indicazione di completamento corrispondente. 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 abbinato a un codice di errore di WSA_IO_PENDING indica che l'operazione sovrapposta è stata avviata correttamente e che verrà fornita un'indicazione successiva quando sono stati utilizzati buffer di invio o quando è stata completata un'operazione di ricezione. Tuttavia, per i socket che sono uno stile di flusso di byte, l'indicazione di completamento si verifica ogni volta che i dati in ingresso vengono esauriti, indipendentemente dal fatto che i buffer siano pieni. Qualsiasi altro codice di errore indica che l'operazione sovrapposta non è stata avviata correttamente e che non sarà prevista alcuna indicazione di completamento.
Le operazioni di invio e ricezione possono essere sovrapposte. Le funzioni di ricezione possono essere richiamate più volte per pubblicare buffer di ricezione in preparazione per i dati in ingresso e le funzioni di invio possono essere richiamate più volte per accodare 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 possono verificarsi in un ordine diverso. Analogamente, sul lato ricevente, i buffer possono essere compilati nell'ordine in cui vengono forniti, ma le indicazioni di completamento possono verificarsi in un ordine diverso.
In molti casi, le operazioni sovrapposte di Winsock usando AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFilee 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 posticipato delle operazioni di I/O sovrapposte è disponibile anche per WSAIoctl, che è una versione avanzata di ioctlsocket.