c++ - servidor - ¿Por qué FD_SET/FD_ZERO para select() dentro del bucle?
socket en c cliente servidor (2)
Estoy usando la función de selección para la comunicación entre mis sockets. Tengo un bucle de tiempo y lo hago -
while(!done) {
FD_ZERO(&read_flags);
FD_ZERO(&write_flags);
FD_SET(comm_fd1, &read_flags);
FD_SET(comm_fd2, &read_flags);
FD_SET(STDIN_FILENO, &read_flags);
FD_SET(comm_fd1, &write_flags);
FD_SET(comm_fd2, &write_flags);
FD_SET(STDIN_FILENO, &write_flags);
//call select
sel = select(comm_fd1+comm_fd2+1, &read_flags, &write_flags, (fd_set*)0, &waitd);
y lo mismo con diferentes variables en el lado del cliente. Obtuve esta técnica básica de un tutorial en línea y simplemente la seguí. Entonces me di cuenta: ¿por qué borro el conjunto y agrego descriptores de archivo cada vez que hago un bucle? Si ya están agregados, ¿por qué borrarlos y agregar nuevamente? Así que solo intenté hacer esto una vez antes, y el código ya no funciona igual. ¿Alguien puede explicar por qué? ¿Es solo porque la selección modifica los contenidos del conjunto? Cualquier ayuda y / o percepción es apreciada.
¿Es solo porque la selección modifica los contenidos del conjunto?
Sí, después de select
devoluciones, solo quedan descriptores listos dentro de los conjuntos.
Cuando select
devuelve, ha actualizado los conjuntos para mostrar qué descriptores de archivo están listos para leer / escribir / excepción. Todas las demás banderas han sido borradas.
Es importante que vuelva a habilitar los descriptores de archivos que se borraron antes de iniciar otra selección; de lo contrario, ya no estará esperando esos descriptores de archivos.
En cuanto al nuevo borrado, puede ser un buen hábito, ya que si necesita cambiar el conjunto de descriptores de archivos (como agregar un socket recién abierto al conjunto de lectura), querrá borrarlo y reconstruirlo. Cada vez, para que sea correcto a medida que cambia el estado del programa.