Condividi tramite


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
WSANOTINITIALISED
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita.
WSAEFAULT
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.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Il valore di timeout non è valido o tutti e tre i parametri del descrittore sono null.
WSAEINTR
Una chiamata di Windows Socket 1.1 bloccata è stata annullata tramite WSACancelBlockingCall.
WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante 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

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.

Nota I dati fuori banda verranno segnalati in questo modo solo se l'opzione SO_OOBINLINE è FALSE. Se un socket elabora una chiamata di connessione (non bloccante), l'errore del tentativo di connessione viene indicato in exceptfds (l'applicazione deve quindi chiamare getsockopt SO_ERROR per determinare il valore di errore per descrivere il motivo dell'errore). Questo documento non definisce quali altri errori verranno inclusi.
 
Qualsiasi due dei parametri, readfds, writefds o exceptfds, può essere assegnato come Null. Almeno uno deve essere diverso da Null e qualsiasi set di descrittori non Null deve contenere almeno un handle per un socket.

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.
writefds:
  • Se si elabora una chiamata di connessione (senza blocco), la connessione ha avuto esito positivo.
  • I dati possono essere inviati.
exceptfds:
  • 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).
Nel file di intestazione Winsock2.h vengono definite quattro macro 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 definendo FD_SETSIZE a un altro valore prima di includere Winsock2.h. Internamente, gli handle di socket in una struttura 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_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à.

Nota La funzione select non ha alcun effetto sulla persistenza degli eventi socket registrati con WSAAsyncSelect o WSAEventSelect.
 
Nota Quando si esegue una chiamata Winsock di blocco, ad esempio select con il parametro di timeout impostato su NULL, Winsock potrebbe dover attendere un evento di rete prima che la chiamata possa essere completata. Winsock esegue un'attesa avvisabile in questa situazione, che può essere interrotta da una chiamata di procedura asincrona pianificata nello stesso thread. L'esecuzione di un'altra chiamata Winsock bloccante all'interno di un APC che ha interrotto una chiamata winsock in corso sullo stesso thread causerà un comportamento non definito e non deve mai essere tentata dai client Winsock.
 
Windows Phone 8: questa funzione è supportata per le app dello Store di Windows Phone in Windows Phone 8 e versioni successive.

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

Vedi anche

TIMEVAL

WSAAsyncSelect

WSAEventSelect

Funzioni Winsock

Informazioni di riferimento su Winsock

Accettare

connect

Recv

recvfrom

send