Condividi tramite


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
Genera una notifica delle modifiche dell'interfaccia di routing per le destinazioni specificate.
FD_ADDRESS_LIST_CHANGE
Genera una 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 WINDOWS Sockets SPI degli eventi di rete e l'oggetto evento associato ha avuto esito positivo. In caso contrario, viene restituito il valore SOCKET_ERROR e un numero di errore specifico è disponibile in lpErrno.

Codice errore Significato
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Indica che uno dei parametri specificati non è valido o 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.

Osservazioni

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 viene identificato da . L'oggetto evento viene impostato quando si verifica uno degli eventi di rete designati.

LPWSPEventSelect funziona in modo molto simile a LPWSPAsyncSelect, la differenza 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 determinare quindi quale degli eventi di rete designati si sono verificati.

LPWSPEventSelect è l'unica funzione che causa la registrazione e il recupero di errori e attività di rete tramite LPWSPEnumNetworkEvents. Vedere le descrizioni di LPWSPSelect e LPWSPAsyncSelect per scoprire come queste funzioni segnalano attività e errori di rete.

Questa funzione imposta automaticamente il di socket 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 dell'evento di rete interno. Ad esempio, per associare un oggetto evento sia alla lettura che alla scrittura di eventi di rete, il client SPI Di Windows Sockets deve chiamare LPWSPEventSelect con FD_READ e FD_WRITE, in questo modo.

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 SPI Windows Sockets, tuttavia, deve comunque chiamare WSACloseEvent per chiudere in modo esplicito l'oggetto evento e liberare tutte le risorse.

Poiché un LPWSPAccept'ed Socket ha le stesse proprietà del socket di ascolto usato per accettarlo, qualsiasi LPWSPEventSelect associazione e selezione di eventi di rete impostati per il socket di ascolto si applica al socket accettato. Ad esempio, se un socket in ascolto ha LPWSPEventSelect associazione di hEventObject con FD_ACCEPT, FD_READ e FD_WRITE, qualsiasi socket accettato in tale socket in ascolto avrà anche FD_ACCEPT, FD_READ e FD_WRITE eventi di rete associati allo stesso hEventObject. Se si desidera un diverso hEventObject o eventi di rete, 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 altre azioni per tale evento di rete finché il client SPI Windows Sockets non effettua la chiamata di funzione che abilita in modo implicito l'impostazione dell'evento di rete e la segnalazione dell'oggetto evento associato.

Evento di rete Riattivazione della 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 indicante che la funzione della condizione ha restituito CF_DEFER
FD_CONNECT NESSUNO
FD_CLOSE NESSUNO
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 il comando SIO_ROUTING_INTERFACE_CHANGE
FD_ADDRESS_LIST_CHANGE LPWSPIoctl con il comando SIO_ADDRESS_LIST_CHANGE

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

Per FD_READ, FD_OOB e FD_ACCEPT eventi di rete, la registrazione degli eventi di rete e la segnalazione di oggetti evento vengono attivata a livello di livello . Ciò significa che se viene chiamata la routine di riattivazione 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, senza tenere traccia della quantità di dati che arrivano in qualsiasi momento. Si consideri la sequenza seguente.

  1. Il provider di servizi riceve 100 byte di dati nel socket , registra l'evento di rete FD_READ e segnala l'oggetto evento di evento associato.
  2. Il client WINDOWS Sockets SPI genera problemi WSPRecv(s, buffptr, 50, 0) 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 queste semantiche, un client WINDOWS Sockets SPI 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 attivato da edge. Un messaggio verrà pubblicato esattamente una volta quando si verifica una modifica della qualità del servizio (QOS). Ulteriori indicazioni non verranno rilasciate finché il provider di servizi non rileva un'ulteriore modifica in QOS o il client SPI Windows Sockets rinegotizza il QOS per il socket.

Anche gli eventi FD_ROUTING_INTERFACE_CHANGE e FD_ADDRESS_LIST_CHANGE vengono considerati attivati da edge . Un messaggio verrà inviato esattamente una volta quando si verifica una modifica dopo il client SPI Windows Sockets ha richiesto la notifica inviando WSAIoctl con SIO_ROUTING_INTERFACE_CHANGE o SIO_ADDRESS_LIST_CHANGE in modo corrispondente. Altri messaggi non saranno disponibili finché il client SPI Windows Sockets non ripubblica il IOCTL e viene rilevata un'altra modifica dopo l'emissione dell'IOCTL.

Se si è già verificato un evento di rete quando il client SPI Windows Sockets chiama LPWSPEventSelecto quando viene chiamata la funzione di riattivazione, viene registrato un evento di rete e l'oggetto evento associato viene segnalato, a seconda delle esigenze. Si consideri ad esempio la sequenza seguente.

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

L'evento di rete FD_WRITE viene gestito in modo leggermente diverso. Un evento di rete FD_WRITE viene registrato quando un socket viene prima connesso con LPWSPConnect o accettato con LPWSPAccepte quindi dopo che un LPWSPSend o LPWSPSendTo ha esito negativo 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 dell'evento di rete FD_WRITE e che dura fino a quando un invio non restituisce WSAEWOULDBLOCK. Dopo un errore di questo tipo, il client SPI Windows Sockets troverà che gli invii sono nuovamente possibili quando viene registrato un evento di rete FD_WRITE e l'oggetto evento associato viene segnalato.

L'evento di rete FD_OOB viene utilizzato 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 fuori banda (accelerati) vengono considerati come dati normali e il client SPI Windows Sockets deve registrare un interesse e otterrà, FD_READ evento di rete, non FD_OOB evento di rete. Un client SPI Windows Sockets può impostare o controllare il modo in cui gestire i dati fuori banda 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 normale o interrotta. Se il codice di errore è 0, la chiusura è stata normale; 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 entra negli stati FIN WAIT o CLOSE WAIT. Ciò risulta dall'esecuzione di un LPWSPShutdown sul lato di invio o da un LPWSPCloseSocket.

I provider di servizi devono registrare solo un evento di rete FD_CLOSE per indicare la chiusura di un circuito virtuale; deve non 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 di flusso associata al socket o al gruppo di socket a cui appartiene rispettivamente il di . Questa modifica deve essere resa disponibile per i client WINDOWS Sockets SPI tramite la funzione LPWSPIoctl con SIO_GET_QOS e/o SIO_GET_GROUP_QOS per recuperare rispettivamente il QOS corrente per il socket o per il gruppo di socket appartiene.

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 modifiche SIO_ROUTING_INTERFACE_CHANGE dopo tale IOCTL è stato rilasciato.

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

Fabbisogno

Requisito Valore
client minimo supportato Windows 10 Build 20348
server minimo supportato Windows 10 Build 20348
intestazione ws2spi.h

Vedere anche

LPWSPEnumNetworkEvents