Funzione di callback LPWSPSELECT (ws2spi.h)

La funzione LPWSPSelect determina lo stato di uno o più socket.

Sintassi

LPWSPSELECT Lpwspselect;

int Lpwspselect(
  [in]      int nfds,
  [in, out] fd_set *readfds,
  [in, out] fd_set *writefds,
  [in, out] fd_set *exceptfds,
  [in]      const timeval *timeout,
  [out]     LPINT lpErrno
)
{...}

Parametri

[in] nfds

Ignorato e incluso solo per motivi di compatibilità.

[in, out] readfds

Puntatore facoltativo a un set di socket da verificare per la leggibilità.

[in, out] writefds

Puntatore facoltativo a un set di socket da controllare per la scrittura.

[in, out] exceptfds

Puntatore facoltativo a un set di socket da controllare per la presenza di errori.

[in] timeout

Tempo massimo di attesa LPWSPSelect oppure Null per un'operazione di blocco, sotto forma di struttura timeval .

[out] lpErrno

Puntatore al codice di errore.

Valore restituito

La funzione LPWSPSelect restituisce il numero totale di descrittori pronti e contenuti nelle strutture fd_set o SOCKET_ERROR se si è verificato un errore. Se il valore restituito è SOCKET_ERROR, è disponibile un codice di errore specifico in lpErrno.

Codice errore Significato
WSAEFAULT
Il provider di servizi Windows Sockets non è riuscito ad allocare risorse necessarie per le operazioni interne oppure i readfds, writefds, exceptfds o parametri timeval non fanno parte dello spazio indirizzi utente.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Il valore di timeout non è valido oppure tutti e tre i parametri descrittori sono stati NULL.
WSAEINTR
La chiamata di blocco è stata annullata tramite LPWSPCancelBlockingCall.
WSAEINPROGRESS
Il blocco della chiamata a Windows Sockets è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAENOTSOCK
Uno dei set di descrittori contiene una voce che non è un socket.

Osservazioni

Questa funzione viene usata per determinare lo stato di uno o più socket. Per ogni socket, il chiamante può richiedere informazioni sullo stato di lettura, scrittura o errore. Il set di socket per cui viene richiesto uno stato specificato è indicato da una struttura di fd_set. Tutte le voci di un fd_set corrispondono ai socket creati dal provider di servizi, ovvero le strutture WSAPROTOCOL_INFO che descrivono i protocolli hanno lo stesso valore providerId ). Al ritorno, le strutture vengono aggiornate in modo da riflettere il subset di questi socket che soddisfano la condizione specificata e LPWSPSelect restituisce il numero totale di socket che soddisfano le condizioni. Viene fornito un set di macro per la modifica di un fd_set. Queste macro sono compatibili con quelle usate nel software Berkeley, ma la rappresentazione sottostante è completamente diversa.

Il parametro readfds identifica i socket da controllare per la leggibilità. Se il socket è attualmente in ascolto tramite LPWSPListen, verrà contrassegnato come leggibile se è stata ricevuta una richiesta di connessione in ingresso, in modo che una LPWSPAccept sia garantita senza blocco. Per altri socket, la leggibilità indica che i dati in coda sono disponibili per la lettura, in modo che non sia garantito che un LPWSPRecv o LPWSPRecvFrom non venga bloccato.

Per i socket orientati alla connessione, la leggibilità può anche indicare che una richiesta di chiusura è stata ricevuta dal peer. Se il circuito virtuale è stato chiuso normalmente, un LPWSPRecv restituirà immediatamente con zero byte letti. Se il circuito virtuale è stato reimpostato, un LPWSPRecv verrà completato immediatamente con un codice di errore, ad esempio WSAECONNRESET. La presenza di dati OOB verrà verificata se l'opzione socket SO_OOBINLINE è stata abilitata (vedere LPWSPSetSockOpt).

Il parametro writefds identifica i socket da controllare per la scrittura:

  • Se un socket si connette tramite LPWSPConnect, la scrittura indica che la connessione è stata completata correttamente.
  • Se il socket non è in fase di ascolto tramite LPWSPConnect, la scrittura significa che un LPWSPSend o LPWSPSendTo è garantito un esito positivo.

Tuttavia, possono bloccarsi su un socket di blocco se il len supera la quantità di spazio del buffer di sistema in uscita disponibile. Non è specificato per quanto tempo queste garanzie possono essere valide, in particolare in un ambiente multithreading.

Il parametro exceptfds identifica i socket da controllare per la presenza di dati OOB o di eventuali condizioni di errore eccezionali. Si noti che i dati OOB verranno segnalati in questo modo solo se l'opzione SO_OOBINLINE è FALSE. Se un socket esegue una connessione LPWSPConnect (non bloccante), l'errore del tentativo di connessione viene indicato in exceptfds. Questa specifica non definisce quali altri errori verranno inclusi.

Due readfds, writefdso exceptfds possono essere forniti come null se non è necessario verificare la condizione di interesse. Almeno uno deve essere diverso danulle qualsiasiset di descrittori Null deve contenere almeno un descrittore socket.

Riepilogo: un socket verrà identificato in un determinato set quando LPWSPSelect restituisce in base alle condizioni seguenti.

Parametro Descrizione
readfds: Se viene chiamato LPWSPListen, una connessione è in sospeso, LPWSPAccept avrà esito positivo. I dati sono disponibili per la lettura (include i dati OOB se SO_OOBINLINE è abilitato). La connessione è stata chiusa,reimpostata/terminata.
writefds: Se LPWSPConnect (nonblocking), la connessione è riuscita. I dati possono essere inviati.
exceptfds: Se LPWSPConnect (nonblocking), il tentativo di connessione non è riuscito. I dati OOB sono disponibili per la lettura (solo se SO_OOBINLINE è disabilitato).

 

 

Nel file di intestazione Ws2spi.h vengono definite tre macro e una funzione upcall per la modifica e il controllo dei set di descrittori. La variabile FD_SETSIZE determina il numero massimo di descrittori in un set. Il valore predefinito di FD_SETSIZE è 64, che può essere modificato da #defining FD_SETSIZE a un altro valore prima di #including Ws2spi.h. Internamente, gli handle socket in un fd_set non sono rappresentati come flag di bit come in Berkeley UNIX. La rappresentazione dei dati è opaca. L'uso di queste macro manterrà la portabilità software tra ambienti socket diversi.

Le macro da modificare e controllare fd_set contenuto sono:

FD_CLR(, *impostato)

Rimuove l' del descrittore da impostato.

FD_SET(, *impostato)

Aggiunge il descrittore a impostare.

FD_ZERO(*impostata)

Inizializza la impostata sul set di null .

La funzione upcall usata per verificare l'appartenenza è:

intWPUFDIsSet (SOCKET, FD_SET FAR *impostato);

che restituirà un valore diverso da zero se è un membro del impostato o in caso contrario zero.

Il parametro timeout controlla per quanto tempo il LPWSPSelect può richiedere il completamento. Se timeout è un puntatore Null , LPWSPSelect si blocca a tempo indeterminato finché almeno un descrittore non soddisfa i criteri specificati. In caso contrario, timeout punta a una struttura timeval che specifica il tempo massimo di attesa LPWSPSelect prima della restituzione. Quando viene restituito LPWSPSelect, il contenuto della struttura timeval non viene modificato. Se timeval viene inizializzato su {0, 0}, LPWSPSelect restituirà immediatamente; viene usato per eseguire il polling dello stato dei socket selezionati. In questo caso, la chiamata LPWSPSelect viene considerata non bloccante e si applicano i presupposti standard per le chiamate non bloccanti. Ad esempio, l'hook di blocco non verrà chiamato e il provider Windows Sockets non restituirà.

Nota

La funzione LPWSPSelect non ha alcun effetto sulla persistenza degli eventi socket registrati con LPWSPAsyncSelect o LPWSPEventSelect.

Fabbisogno

Requisito Valore
client minimo supportato Windows 2000 Professional [solo app desktop]
server minimo supportato Windows 2000 Server [solo app desktop]
intestazione ws2spi.h

Vedere anche

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo