Condividi tramite


Funzione WPUCompleteOverlappedRequest (ws2spi.h)

La funzione WPUCompleteOverlappedRequest esegue una notifica di completamento di I/O sovrapposta per le operazioni di I/O sovrapposte.

Sintassi

int WPUCompleteOverlappedRequest(
  [in]  SOCKET          s,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  DWORD           dwError,
  [in]  DWORD           cbTransferred,
  [out] LPINT           lpErrno
);

Parametri

[in] s

Socket del provider di servizi creato da WPUCreateSocketHandle.

[in] lpOverlapped

Puntatore a una struttura WSAOVERLAPPED associata all'operazione di I/O sovrapposta il cui completamento deve essere notificato.

[in] dwError

Stato di completamento dell'operazione di I/O sovrapposta il cui completamento deve essere notificato.

[in] cbTransferred

Il numero di byte trasferiti a o da buffer client (la direzione del trasferimento dipende dalla natura di invio o ricezione dell'operazione di I/O sovrapposta il cui completamento deve essere notificato).

[out] lpErrno

Puntatore al codice di errore risultante dall'esecuzione di questa funzione.

Valore restituito

Se non si verifica alcun errore, WPUCompleteOverlappedRequest restituisce zero e notifica il completamento dell'operazione di I/O sovrapposta in base al meccanismo selezionato dal client (segnala un evento trovato nella struttura WSAOVERLAPPED a cui fa riferimento la struttura lpOverlapped e/o esegue una coda di un report sullo stato di completamento alla porta di completamento associata al socket se è associata una porta di completamento). In caso contrario, WPUCompleteOverlappedRequest restituisce SOCKET_ERROR e un codice di errore specifico è disponibile in lpErrno.

Codice di errore Significato
WSAEINVAL
Il socket passato nel parametro s non è un socket creato da WPUCreateSocketHandle.

Commenti

La funzione WPUCompleteOverlappedRequest esegue una notifica di completamento di I/O sovrapposta per le operazioni di I/O sovrapposte in cui il meccanismo di completamento specificato dal client è diverso dalla chiamata di procedura asincrona in modalità utente (APC). Questa funzione può essere usata solo per gli handle socket creati da WPUCreateSocketHandle.

**Nota** Questa funzione è diversa da altre funzioni con il prefisso "WPU" in cui non viene eseguito l'accesso tramite la tabella upcall. Viene invece esportato direttamente da Ws2_32.dll. I provider di servizi che devono chiamare questa funzione devono collegare WS2_32.lib o usare funzioni appropriate del sistema operativo, ad esempio LoadLibrary e GetProcAddress per recuperare il puntatore alla funzione.
 
La funzione **WPUCompleteOverlappedRequest** viene usata dai provider di servizi che non implementano la funzionalità IFS (Installable File System) direttamente per gli handle del socket esposti. Esegue una notifica di completamento per qualsiasi richiesta di I/O sovrapposta per cui la notifica di completamento specificata è diversa da un APC in modalità utente. **WPUCompleteOverlappedRequest** è supportato solo per gli handle di socket creati direttamente da WPUCreateSocketHandle e non per i socket creati direttamente da un provider di servizi.

Se il client seleziona un APC in modalità utente come metodo di notifica, il provider di servizi deve usare WPUQueueApc o un'altra funzione del sistema operativo appropriata per eseguire la notifica di completamento. Se L'APC in modalità utente non è selezionato dal client, un provider di servizi che non implementa direttamente la funzionalità IFS non può determinare se il client ha associato una porta di completamento con l'handle socket. Pertanto, non può determinare se il metodo di notifica di completamento deve accodare un record di stato di completamento a una porta di completamento o segnalare un evento trovato nella struttura WSAOVERLAPPED . L'architettura di Windows Socket 2 tiene traccia di qualsiasi associazione di porte di completamento con un socket creato da WPUCreateSocketHandle e può prendere una decisione corretta tra notifica basata su porta di completamento o notifica basata su eventi.

Quando WPUCompleteOverlappedRequest accoda un'indicazione di completamento, imposta il membro InternalHigh della struttura WSAOVERLAPPED sul conteggio dei byte trasferiti. Imposta quindi il membro interno su un valore dipendente dal sistema operativo diverso dal valore speciale WSS_OPERATION_IN_PROGRESS. Potrebbe verificarsi un lieve ritardo dopo che WPUCompleteOverlappedRequest restituisce prima che vengano visualizzati questi valori, poiché l'elaborazione può verificarsi in modo asincrono. Tuttavia, il valore InternalHigh (conteggio byte) è garantito che venga impostato dal momento in cui è impostato Internal .

WPUCompleteOverlappedRequest funziona come indicato (esegue la notifica di completamento richiesta dal client) se l'handle del socket è stato associato a una porta di completamento.

Interazione con WSPGetOverlappedResult

Il comportamento di WPUCompleteOverlappedRequest inserisce alcuni vincoli sul modo in cui un provider di servizi implementa WSPGetOverlappedResult poiché solo i membri Offset e OffsetHigh della struttura WSAOVERLAPPED sono controllati esclusivamente dal provider di servizi, ma è necessario recuperare tre valori (conteggio byte, flag ed errore) dalla struttura di WSPGetOverlappedResult. Un provider di servizi può eseguire questa operazione in qualsiasi modo, purché interagisca con il comportamento di WPUCompleteOverlappedRequest correttamente. Tuttavia, un'implementazione tipica è la seguente:

  • All'inizio dell'elaborazione sovrapposta, il provider di servizi imposta Internal su WSS_OPERATION_IN_PROGRESS.
  • Al termine dell'operazione di I/O, il provider imposta OffsetHigh sul codice di errore di Windows Socket 2 risultante dall'operazione, imposta Offset sui flag risultanti dall'operazione di I/O e chiama WPUCompleteOverlappedRequest, passando il conteggio dei byte di trasferimento come uno dei parametri. WPUCompleteOverlappedRequest imposta infine InternalHigh sul conteggio dei byte di trasferimento, quindi imposta Internal su un valore diverso da WSS_OPERATION_IN_PROGRESS.
  • Quando viene chiamato WSPGetOverlappedResult , il provider di servizi controlla Internal. Se è WSS_OPERATION_IN_PROGRESS, il provider attende l'handle dell'evento nel membro hEvent o restituisce un errore, in base all'impostazione del flag FWAIT di WSPGetOverlappedResult. Se non è in corso o dopo il completamento dell'attesa, il provider restituisce rispettivamente i valori di InternalHigh, OffsetHigh e Offset come conteggio dei trasferimenti, codice di errore del risultato dell'operazione e flag.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione ws2spi.h

Vedi anche

WPUCreateSocketHandle

WPUQueueApc

WSAOVERLAPPED

WSPGetOverlappedResult