Funzione select (winsock2.h)
La funzione select determina lo stato di uno o più socket, in attesa, se necessario, per eseguire operazioni di I/O sincrone.
Sintassi
int WSAAPI select(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout
);
Parametri
[in] nfds
Ignorato. Il parametro nfds è incluso solo per la compatibilità con i socket Berkeley.
[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 verificare per la grafia.
[in, out] exceptfds
Puntatore facoltativo a un set di socket da controllare per verificare la presenza di errori.
[in] timeout
Tempo massimo di attesa per la selezione , fornito sotto forma di struttura TIMEVAL . Impostare il parametro di timeout su Null per le operazioni di blocco.
Valore restituito
La funzione select restituisce il numero totale di handle socket pronti e contenuti nelle strutture di fd_set , zero se il limite di tempo è scaduto o SOCKET_ERROR se si è verificato un errore. Se il valore restituito è SOCKET_ERROR, È possibile usare WSAGetLastError per recuperare un codice di errore specifico.
Codice di errore | Significato |
---|---|
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita. | |
L'implementazione di Windows Sockets non è stata in grado di allocare le risorse necessarie per le operazioni interne oppure i parametri readfds, writefds, exceptfds o timeval non fanno parte dello spazio indirizzi utente. | |
Il sottosistema di rete non è riuscito. | |
Il valore di timeout non è valido o tutti e tre i parametri del descrittore sono null. | |
Una chiamata di Windows Socket 1.1 bloccata è stata annullata tramite WSACancelBlockingCall. | |
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback. | |
Uno dei set di descrittori contiene una voce che non è un socket. |
Commenti
La funzione select 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 . I socket contenuti all'interno delle strutture fd_set devono essere associati a un singolo provider di servizi. Ai fini di questa restrizione, i socket vengono considerati dello stesso provider di servizi se le strutture WSAPROTOCOL_INFO che descrivono i protocolli hanno lo stesso valore providerId . Al termine della restituzione, le strutture vengono aggiornate per riflettere il subset di questi socket che soddisfano la condizione specificata. La funzione select restituisce il numero di socket che soddisfano le condizioni. Viene fornito un set di macro per la modifica di una struttura 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 verificare per la leggibilità. Se il socket è attualmente nello stato di ascolto , verrà contrassegnato come leggibile se è stata ricevuta una richiesta di connessione in ingresso in modo che un'accettazione venga completata senza bloccare. Per altri socket, la leggibilità indica che i dati in coda sono disponibili per la lettura in modo che una chiamata a recv, WSARecv, WSARecvFrom o recvfrom non venga bloccata.
Per i socket orientati alla connessione, la leggibilità può anche indicare che una richiesta di chiusura del socket è stata ricevuta dal peer. Se il circuito virtuale è stato chiuso normalmente e tutti i dati sono stati ricevuti, un recv restituirà immediatamente con zero byte letti. Se il circuito virtuale è stato reimpostato, un recv 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 setsockopt).
I writefds del parametro identificano i socket che devono essere controllati per verificare la scrivibilità. Se un socket elabora una chiamata di connessione (non bloccante), un socket è scrivibile se la connessione viene completata correttamente. Se il socket non elabora una chiamata di connessione , la scrivibilità significa che un invio, un sendto o WSASendto avrà esito positivo. Tuttavia, possono bloccarsi su un socket di blocco se il parametro len supera la quantità di spazio del buffer di sistema in uscita disponibile. Non viene specificato per quanto tempo queste garanzie possono essere valide, in particolare in un ambiente multithreading.
Il parametro exceptfds identifica i socket che devono essere verificati per la presenza di dati OOB o di eventuali condizioni di errore eccezionali.
In sintesi, un socket verrà identificato in un determinato set quando la selezione restituisce se:
readfds:
- Se il listen è stato chiamato e una connessione è in sospeso, l'accettazione avrà esito positivo.
- I dati sono disponibili per la lettura (include i dati OOB se SO_OOBINLINE è abilitato).
- La connessione è stata chiusa/ reimpostata/terminata.
- Se si elabora una chiamata di connessione (senza blocco), la connessione ha avuto esito positivo.
- I dati possono essere inviati.
- Se si elabora una chiamata di connessione (non bloccante), il tentativo di connessione non è riuscito.
- I dati OOB sono disponibili per la lettura (solo se SO_OOBINLINE è disabilitato).
- FD_ZERO(*set): inizializza impostato sul set vuoto. Un set deve essere sempre cancellato prima di usare.
- FD_CLR(s, *set) - Rimuove socket s dal set.
- FD_ISSET,*set): verifica se s è un membro del set e restituisce TRUE in tal caso.
- FD_SET,*set): aggiunge socket s da impostare.
Il timeout del parametro controlla il tempo necessario per il completamento della selezione . Se il timeout è un puntatoreNull, select bloccherà per un periodo illimitato fino a quando almeno un descrittore soddisfa i criteri specificati. In caso contrario, il timeout punta a una struttura TIMEVAL che specifica il tempo massimo di attesa da selezionare prima della restituzione. Quando la selezione restituisce un risultato, il contenuto della struttura TIMEVAL non viene modificato. Se TIMEVAL viene inizializzato su {0, 0}, selezionare restituirà immediatamente; viene usato per eseguire il polling dello stato dei socket selezionati. Se select restituisce immediatamente, la chiamata select 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 Windows Sockets non restituirà.
Windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.
Requisiti
Client minimo supportato | Windows 8.1, Windows Vista [app desktop | App UWP] |
Server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | winsock2.h |
Libreria | Ws2_32.lib |
DLL | Ws2_32.dll |