Funzione di callback LPWSPEVENTSELECT (ws2spi.h)

La funzione LPWSPEventSelect specifica un oggetto evento da associare al set fornito di eventi di rete.

Sintassi

LPWSPEVENTSELECT Lpwspeventselect;

int Lpwspeventselect(
  [in]  SOCKET s,
  [in]  WSAEVENT hEventObject,
  [in]  long lNetworkEvents,
  [out] LPINT lpErrno
)
{...}

Parametri

[in] s

Descrittore che identifica il socket.

[in] hEventObject

Handle che identifica l'oggetto evento da associare al set fornito di eventi di rete.

[in] lNetworkEvents

Maschera di bit che specifica la combinazione di eventi di rete in cui il client SPI Windows Sockets ha interesse. Costruito usando l'operatore OR bit per bit con uno di questi valori.

Valore Significato
FD_READ
Notifica dell'idoneità per la lettura.
FD_WRITE
Notifica dell'idoneità per la scrittura.
FD_OOB
Notifica dell'arrivo dei dati OOB.
FD_ACCEPT
Notifica dei problemi relativi alle connessioni in ingresso.
FD_CONNECT
Notifica dei problemi di connessione completata.
FD_CLOSE
Notifica dei problemi di chiusura del socket.
FD_QOS
Problemi di notifica delle modifiche del socket (QoS).
FD_GROUP_QOS
Riservato.
FD_ROUTING_INTERFACE_CHANGE
Notifica delle modifiche dell'interfaccia di routing per le destinazioni specificate.
FD_ADDRESS_LIST_CHANGE
Notifica delle modifiche all'elenco di indirizzi locali per la famiglia di indirizzi del socket.

[out] lpErrno

Puntatore al codice di errore. Per altre informazioni, vedi la sezione Valore restituito .

Valore restituito

Il valore restituito è zero se la specifica del client SPI Windows Sockets degli eventi di rete e l'oggetto evento associato ha avuto esito positivo. In caso contrario, viene restituito il valore SOCKET_ERROR e in lpErrno è disponibile un numero di errore specifico.

Codice di errore Significato
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Indica che uno dei parametri specificati non è valido oppure il socket specificato è in uno stato non valido.
WSAEINPROGRESS
Il blocco della chiamata a Windows Sockets è in corso o il provider di servizi sta ancora elaborando una funzione di callback.
WSAENOTSOCK
Il descrittore non è un socket.

Commenti

Questa funzione viene usata per specificare un oggetto evento, hEventObject, da associare agli eventi di rete selezionati, lNetworkEvents. Il socket per il quale viene specificato un oggetto evento è identificato da s. L'oggetto evento viene impostato quando si verifica uno degli eventi di rete designati.

LPWSPEventSelect opera in modo molto simile a LPWSPAsyncSelect, la differenza si verifica nelle azioni eseguite quando si verifica un evento di rete designato. Mentre WSPAsyncSelect determina la pubblicazione di un messaggio Windows Sockets SPI specificato dal client Windows, LPWSPEventSelect imposta l'oggetto evento associato e registra l'occorrenza di questo evento in un record di eventi di rete interno. Un client SPI Windows Sockets può usare LPWSPEnumNetworkEvents per recuperare il contenuto del record di eventi di rete interno e quindi determinare quale degli eventi di rete designati si sono verificati.

LPWSPEventSelect è l'unica funzione che causa la registrazione e gli errori di rete e gli errori tramite LPWSPEnumNetworkEvents. Vedere le descrizioni di LPWSPSelect e LPWSPAsyncSelect per scoprire in che modo tali funzioni segnalano l'attività e gli errori di rete.

Questa funzione imposta automaticamente socket s sulla modalità non bloccante, indipendentemente dal valore di lNetworkEvents.

L'emissione di un LPWSPEventSelect per un socket annulla qualsiasi precedente LPWSPAsyncSelect o LPWSPEventSelect per lo stesso socket e cancella il record di eventi di rete interno. Ad esempio, per associare un oggetto evento sia alla lettura che alla scrittura di eventi di rete, il client SPI Windows Sockets deve chiamare LPWSPEventSelect con FD_READ e FD_WRITE, come illustrato di seguito.

rc = WSPEventSelect(s, hEventObject, FD_READ | FD_WRITE);

Non è possibile specificare oggetti evento diversi per eventi di rete diversi. Il codice seguente non funzionerà; la seconda chiamata annulla gli effetti del primo e l'unica associazione sarà l'evento di rete FD_WRITE associato a hEventObject2.

// Incorrect example.
rc = WSPEventSelect(s, hEventObject1, FD_READ);
rc = WSPEventSelect(s, hEventObject2, FD_WRITE);

Per annullare l'associazione e la selezione di eventi di rete in un socket, è necessario impostare lNetworkEvents su zero, nel qual caso il parametro hEventObject viene ignorato.

rc = WSPEventSelect(s, hEventObject, 0);

La chiusura di un socket con LPWSPCloseSocket annulla anche l'associazione e la selezione di eventi di rete specificati in LPWSPEventSelect per il socket. Il client WINDOWS Sockets SPI, tuttavia, deve comunque chiamare WSACloseEvent per chiudere in modo esplicito l'oggetto evento e liberare tutte le risorse.

Poiché un socket LPWSPAccept'ed ha le stesse proprietà del socket di ascolto usato per accettarlo, qualsiasi associazione LPWSPEventSelect impostata per il socket di ascolto si applica al socket accettato. Ad esempio, se un socket in ascolto ha l'associazione LPWSPEventSelect di hEventObject con FD_ACCEPT, FD_READ e FD_WRITE, qualsiasi socket accettato su tale socket in ascolto avrà anche FD_ACCEPT, FD_READ e FD_WRITE eventi di rete associati allo stesso hEventObject. Se si desiderano eventi di rete o hEventObject diversi, il client SPI Windows Sockets deve chiamare LPWSPEventSelect, passando il socket accettato e le nuove informazioni desiderate.

Dopo aver registrato correttamente l'occorrenza dell'evento di rete e segnalato l'oggetto evento associato, non vengono eseguite ulteriori azioni per tale evento di rete finché il client SPI Windows Sockets effettua la chiamata di funzione che riabilita in modo implicito l'impostazione dell'evento di rete e la segnalazione dell'oggetto evento associato.

Evento di rete Riabilitare la funzione
FD_READ LPWSPRecv o LPWSPRecvFrom
FD_WRITE LPWSPSend o LPWSPSendTo
FD_OOB LPWSPRecv o LPWSPRecvFrom
FD_ACCEPT LPWSPAccept, a meno che il codice di errore restituito non sia WSATRY_AGAIN che indica che la funzione della condizione ha restituito CF_DEFER
FD_CONNECT NONE
FD_CLOSE NONE
FD_QOS LPWSPIoctl con SIO_GET_QOS
FD_GROUP_QOS Riservato per uso futuro con i gruppi di socket: LPWSPIoctl con SIO_GET_GROUP_QOS
FD_ROUTING_INTERFACE_CHANGE LPWSPIoctl con comando SIO_ROUTING_INTERFACE_CHANGE
FD_ADDRESS_LIST_CHANGE LPWSPIoctl con comando SIO_ADDRESS_LIST_CHANGE

Qualsiasi chiamata alla routine di riabilitazione, anche una che ha esito negativo, comporta la riabilitazione della registrazione e della segnalazione per l'evento di rete e l'oggetto evento pertinenti, rispettivamente.

Per FD_READ, FD_OOB e FD_ACCEPT eventi di rete, la registrazione degli eventi di rete e la segnalazione degli oggetti evento vengono attivati a livello. Ciò significa che se viene chiamata la routine di riabilitazione e la condizione di rete pertinente è ancora valida dopo la chiamata, l'evento di rete viene registrato e l'oggetto evento associato viene segnalato. Ciò consente a un client SPI Windows Sockets di essere guidato dagli eventi, pur non tenendo traccia della quantità di dati che arrivano in qualsiasi momento. Considerare la sequenza indicata di seguito.

  1. Il provider di servizi riceve 100 byte di dati nel socket s, registra l'evento di rete FD_READ e segnala l'oggetto evento associato.
  2. Problemi del client WSPRecv(s, buffptr, 50, 0) SPI Windows Sockets per leggere 50 byte.
  3. Il provider di servizi registra l'evento di rete FD_READ e segnala di nuovo l'oggetto evento associato perché sono ancora presenti dati da leggere.

Con questa semantica, un client SPI Di Windows Sockets non deve leggere tutti i dati disponibili in risposta a un evento di rete FD_READ. Invece, un singolo LPWSPRecv in risposta a ogni evento di rete FD_READ è appropriato.

Gli eventi di FD_QOS e FD_GROUP_QOS vengono considerati attivati in modo perimetrale. Un messaggio verrà pubblicato esattamente una volta quando si verifica una modifica della qualità del servizio (QOS). Ulteriori indicazioni non verranno rilasciate fino a quando il provider di servizi rileva una modifica ulteriore in QOS o il client SPI di Windows Sockets rinegotizza il QOS per il socket.

Gli eventi di FD_ROUTING_INTERFACE_CHANGE e FD_ADDRESS_LIST_CHANGE vengono considerati anche attivati dal bordo . Un messaggio verrà inviato esattamente una volta quando si verifica una modifica dopo che il client SPI di Windows Sockets ha richiesto la notifica eseguendo WSAIoctl con SIO_ROUTING_INTERFACE_CHANGE o SIO_ADDRESS_LIST_CHANGE corrispondentemente. Altri messaggi non saranno disponibili fino a quando il client SPI Windows Sockets ripubblica IOCTL e un'altra modifica viene rilevata dopo l'emissione di IOCTL.

Se un evento di rete è già accaduto quando il client SPI Windows Sockets chiama LPWSPEventSelect o quando viene chiamata la funzione di riattivazione, viene registrato un evento di rete e l'oggetto evento associato viene segnalato, come appropriato. Si consideri ad esempio la sequenza seguente.

  1. Un client SPI di Windows Sockets chiama LPWSPListen.
  2. Viene ricevuta una richiesta di connessione, ma non ancora accettata.
  3. Il client SPI di Windows Sockets chiama LPWSPEventSelect specificando che è interessato all'evento di rete FD_ACCEPT per il socket. Il provider di servizi registra immediatamente l'evento di rete FD_ACCEPT e segnala immediatamente l'oggetto evento associato.

L'evento di rete FD_WRITE viene gestito leggermente diversamente. Un evento di rete FD_WRITE viene registrato quando un socket è connesso per la prima volta con LPWSPConnect o accettato con LPWSPAccept, quindi dopo che un LPWSPSend o LPWSPSendTo non riesce con WSAEWOULDBLOCK e lo spazio del buffer diventa disponibile. Pertanto, un client WINDOWS Sockets SPI può presupporre che gli invii siano possibili a partire dalla prima impostazione di eventi di rete FD_WRITE e che durano fino a quando un invio restituisce WSAEWOULDBLOCK. Dopo un errore di questo tipo, il client SPI di Windows Sockets troverà di nuovo possibile l'invio quando viene registrato un evento di rete FD_WRITE e l'oggetto evento associato viene segnalato.

L'evento di rete FD_OOB viene usato solo quando un socket è configurato per ricevere i dati fuori banda separatamente. Se il socket è configurato per ricevere dati fuori banda in linea, i dati out-of-band (expedited) vengono trattati come dati normali e il client SPI di Windows Sockets deve registrare un interesse e otterrà, FD_READ evento di rete, non FD_OOB evento di rete. Un client SPI di Windows Sockets può impostare o controllare il modo in cui i dati fuori banda devono essere gestiti usando LPWSPSetSockOpt o LPWSPGetSockOpt per l'opzione SO_OOBINLINE.

Il codice di errore in un evento di rete FD_CLOSE indica se la chiusura del socket è stata graziata o interrotta. Se il codice di errore è 0, la chiusura è stata graziata; se il codice di errore è WSAECONNRESET, il circuito virtuale del socket è stato reimpostato. Questo vale solo per i socket orientati alla connessione, ad esempio SOCK_STREAM.

L'evento di rete FD_CLOSE viene registrato quando viene ricevuta un'indicazione di chiusura per il circuito virtuale corrispondente al socket. In termini TCP, ciò significa che il FD_CLOSE viene registrato quando la connessione passa agli stati FIN WAIT o CLOSE WAIT. Questo risultato dalla fine remota esegue un LPWSPShutdown sul lato di invio o un LPWSPCloseSocket.

Un provider di servizi deve registrare solo un evento di rete FD_CLOSE per indicare la chiusura di un circuito virtuale; non deve registrare un evento di rete FD_READ per indicare tale condizione.

L'evento di rete FD_QOS o FD_GROUP_QOS viene registrato quando è stata apportata una modifica a qualsiasi campo nella specifica del flusso associata a socket s o al gruppo di socket a cui appartiene rispettivamente. Questa modifica deve essere resa disponibile per i client SPI di Windows Sockets tramite la funzione LPWSPIoctl con SIO_GET_QOS e/o SIO_GET_GROUP_QOS per recuperare rispettivamente il QOS corrente per socket s o per il gruppo di socket appartiene rispettivamente.

L'evento di rete FD_ROUTING_INTERFACE_CHANGE viene registrato quando l'interfaccia locale che deve essere usata per raggiungere la destinazione specificata in WSAIoctl con SIO_ROUTING_INTERFACE_CHANGE modifiche dopo l'emissione di tale IOCTL.

L'evento di rete FD_ADDRESS_LIST_CHANGE viene registrato quando viene registrato l'elenco di indirizzi della famiglia di protocolli socket a cui il client SPI di Windows Sockets può associare le modifiche dopo l'emissione di WSAIoctl con SIO_ADDRESS_LIST_CHANGE.

Requisiti

Requisito Valore
Client minimo supportato Windows 10 Build 20348
Server minimo supportato Windows 10 Build 20348
Intestazione ws2spi.h

Vedi anche

LPWSPEnumNetworkEvents