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 controllare 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 gli errori.

[in] timeout

Tempo massimo per LPWSPSelect per attendere o 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 di errore Significato
WSAEFAULT
Il provider di servizi Windows Sockets non è stato in grado di allocare le risorse necessarie per le operazioni interne o i parametri readfds, writefds, trannefds o timeval non fanno parte dello spazio degli indirizzi utente.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Il valore di timeout non è valido o tutti e tre i parametri descrittori erano NULL.
WSAEINTR
(Blocco) chiamata 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.

Commenti

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 fd_set . Tutte le voci in 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 per 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 che devono essere controllati 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 un LPWSPAccept sia garantito senza bloccare. Per altri socket, la leggibilità significa che i dati in coda sono disponibili per la lettura in modo 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 correttamente, un LPWSPRecv restituirà immediatamente con zero byte di lettura. 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à controllata se l'opzione socket SO_OOBINLINE è stata abilitata (vedere LPWSPSetSockOpt).

I writefds dei parametri identificano i socket che devono essere controllati per la scrittura:

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

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

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

Qualsiasi due valori readfds, writefds o exceptfds può essere fornito come null se non devono essere verificati alcun descrittore per la condizione di interesse. Almeno uno deve essere non null e qualsiasi set di descrittore non Null deve contenere almeno un descrittore socket.

Riepilogo: un socket verrà identificato in un determinato set quando LPWSPSelect restituisce in base al seguente.

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

 

 

Tre macro e una funzione upcall sono definite nel file di intestazione Ws2spi.h per modificare e controllare i 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, i handle socket in una 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, *set

Rimuove il descrittore daset.

FD_SET, *set

Aggiunge descrittore s da impostare.

FD_ZERO(*set)

Inizializza il set su Null .

La funzione upcall usata per verificare che l'appartenenza sia:

intWPUFDIsSet (SOCKETs, FD_SET FAR *set);

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

Il timeout dei parametri controlla il tempo necessario per il completamento di LPWSPSelect . Se timeout è un puntatore Null , LPWSPSelect blocca indefinito fino a quando almeno un descrittore soddisfa i criteri specificati. In caso contrario, timeout punta a una struttura timeval che specifica il tempo massimo che LPWSPSelect deve attendere prima di restituire. Quando LPWSPSelect restituisce, il contenuto della struttura timeval non viene modificato. Se timeval viene inizializzato in {0, 0}, LPWSPSelect restituirà immediatamente; viene usato per eseguire il polling dello stato dei socket selezionati. Se si tratta del caso, la chiamata LPWSPSelect viene considerata non sbloccante e i presupposti standard per le chiamate non sbloccanti si applicano. 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.

Requisiti

   
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Intestazione ws2spi.h

Vedi anche

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo