Select imposta la bit corrispondente al descrittore di file nel set, quindi, non è necessario eseguire iterazioni su tutti i file fds se si è interessati solo a pochi (e si possono ignorare altri) basta testare solo i descrittori di file per i quali si è interessati.
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(4);
}
if(FD_ISSET(fd0, &read_fds))
{
//do things
}
if(FD_ISSET(fd1, &read_fds))
{
//do more things
}
EDIT
Ecco la struct fd_set:
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;
Dove, fd_count è il numero di socket set (in modo, è possibile aggiungere un'ottimizzazione di utilizzare questo) e fd_array è un vettore bit (della dimensione FD_SETSIZE * sizeof (int) che dipende dalla macchina). Nella mia macchina, è 64 * 64 = 4096.
Quindi, la tua domanda è essenzialmente: qual è il modo più efficace per trovare le posizioni di bit di 1s in un vettore bit (di dimensioni intorno a 4096 bit)?
Voglio cancellare una cosa qui:
"looping attraverso tutti i socket connessi" non significa che stai effettivamente leggendo/facendo roba per una connessione. FD_ISSET() controlla solo il tempo in cui il bit in fd_set posizionato al numero assegnato del file_digriptor della connessione è impostato o meno. Se l'efficienza è il tuo obiettivo, allora non è questo il più efficiente? usando l'euristica?
Si prega di dirci cosa c'è di sbagliato con questo metodo, e che cosa stai cercando di raggiungere con il metodo alternativo.
Per sottolineare quello che voglio dire. Non voglio utilizzare l'approccio FD_ISSET poiché richiede di eseguire il ciclo di tutte le prese collegate. Ma poiché, per definizione, select() rimuove i descrittori di file non rilevanti dal set, voglio fare un ciclo attraverso il set. – Andreas
Non significa necessariamente "tutti connessi". È possibile passare un sottoinsieme dei socket connessi per selezionare e quindi utilizzare FD_ISSET solo su quel sottoinsieme dopo la selezione dei resi. Inoltre, c'è un problema reale con il loop su tutti loro? A meno che non abbiate a che fare con molte migliaia di socket connessi, il ciclo richiederà probabilmente un tempo irrilevante. – Rakis
D'accordo con Rakis. Questa è una di quelle cose che sembrano inefficienti, ma nella maggior parte dei casi non è proprio vero. Il tempo di attraversare il ciclo sarà sminuito dal tempo necessario per servire solo uno degli FD impostati. – Duck