Seleccionar establece el un bit correspondiente al descriptor de archivo en el conjunto, por lo tanto, no necesita iterar a través de todos los fds si está interesado en unos pocos (y puede ignorar otros) simplemente pruebe solo los descriptores de archivo que le interesan.
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
}
EDITAR
Aquí está la estructura 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;
Cuando, fd_count es el número de sockets establecidos (por lo que, se puede añadir una optimización de utilizar este) y fd_array es una bit-vector (del tamaño FD_SETSIZE * sizeof (int) que depende de la máquina). En mi máquina, es 64 * 64 = 4096.
Entonces, su pregunta es esencialmente: ¿cuál es la forma más eficiente de encontrar las posiciones de bit de 1s en un vector de bits (de tamaño alrededor de 4096 bits)?
Quiero aclarar una cosa aquí:
"bucle a través de todos los enchufes conectados" no significa que realmente está leyendo/haciendo cosas para una conexión. FD_ISSET() solo verifica que el tiempo en el fd_set ubicado en el número asignado de file_descriptor asignado a la conexión esté configurado o no. Si su objetivo es la eficiencia, ¿no es esto lo más eficiente? usando heurística?
Cuéntanos qué le pasa a este método y qué intentas lograr con el método alternativo.
Para enfatizar lo que quiero decir. No quiero utilizar el enfoque FD_ISSET ya que me obliga a recorrer todos los sockets conectados. Pero dado que, por definición, select() elimina los descriptores de archivos no relevantes del conjunto, quiero recorrer el conjunto. – Andreas
No necesariamente significa "todos conectados". Puede pasar un subconjunto de sus sockets conectados para seleccionar y luego usar FD_ISSET solo en ese subconjunto luego de seleccionar devoluciones. Además, ¿hay un problema real con el bucle sobre todos ellos? A menos que tenga que lidiar con muchos miles de enchufes conectados, es probable que el ciclo tarde un tiempo intrascendente. – Rakis
De acuerdo con Rakis. Esta es una de esas cosas que parece ser ineficiente, pero en la mayoría de los casos realmente no lo es. El tiempo para pasar por el ciclo se verá empequeñecido por el tiempo que tarda en atender solo uno de los FD establecidos. – Duck