Soy nuevo en la programación de socket y tengo problemas para entender cómo funcionan select()
y FD_SET()
.Cómo usar select y FD_SET en la programación de socket?
Modifico un ejemplo del tutorial de Beej en un intento de resolverlo. Lo que quiero hacer en el ciclo for es que en cada iteración espero 4 segundos. Si hay una lectura disponible, imprimirá "Se presionó una tecla" y, si se agota el tiempo de espera, se imprimirá "Tiempo de espera agotado". Luego borre el conjunto y repita el proceso 9 veces más. Pero parece que una vez que se establece el descriptor de archivo 0, nunca se desarma, incluso después de una llamada a FD_ZERO()
y/o FD_CLR()
. En otras palabras, después de presionar una tecla en la primera iteración del ciclo, el descriptor de archivo se establece para el resto de las iteraciones y ya no se hace más espera. Entonces debe haber algo que me falta, pero no sé qué.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define SERVERPORT 4950
int main(int argc, char *argv[]) {
struct sockaddr_in their_addr; // connector's address information
struct hostent *he;
int numbytes;
int broadcast = 1;
if ((he=gethostbyname(argv[1])) == NULL) { // get the host info
perror("gethostbyname");
exit(1);
}
// this call is what allows broadcast packets to be sent:
if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
sizeof broadcast) == -1) {
perror("setsockopt (SO_BROADCAST)");
exit(1);
}
their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(SERVERPORT); // short, network byte order
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
struct timeval tv;
fd_set broadcastfds;
int i;
for(i=0; i < 10; i++) {
tv.tv_sec = 4;
tv.tv_usec = 500000;
FD_ZERO(&broadcastfds);
FD_CLR(0, &broadcastfds);
FD_SET(0, &broadcastfds);
if(select(0+1, &broadcastfds, NULL, NULL, &tv) == -1) perror("select");
if (FD_ISSET(0, &broadcastfds)) printf("A key was pressed!\n");
else printf("Timed out.\n");
fflush(stdout);
}
close(sockfd);
return 0;
}
No tiene que ver con nada. Lo siento, hice un mal trabajo eliminando las partes innecesarias de mi pregunta. – user1161604