¿Alguna idea de por qué cuando el servidor escribe un socket mientras el cliente espera en seleccionar, selecciona never termina?usando seleccionar para esperar datos en un socket de cliente
Estoy usando c para comunicarme entre tomas. Mi cliente se conecta a mi servidor bien.
socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor
client->address.sin_addr.s_addr = inet_addr(ipAddress);
client->address.sin_family = AF_INET;
client->address.sin_port = htons(port);
bind(socket_desc,&address,sizeof(address));
connect(socket_desc, &address, sizeof(address));
Cuando uso recv para bloquear y escuche los datos, todo funciona bien:
int bytesRead = 1;
while(bytesRead){
int bufsize=1024;
char *buffer=malloc(bufsize);
bytesRead = recv(socket_desc, buffer, bufsize, 0);
printf("CLIENT RECV: %s", buffer);
}
Si trato de usar select, no parece que leer los datos. Si agrego STDIN al fd_set, puedo obligarlo a leer desde el socket, pero parece que no parece activarse desde el socket_desc leyendo datos ...
int running = 1;
while(running){
/* wait for something to happen on the socket */
struct timeval selTimeout;
selTimeout.tv_sec = 2; /* timeout (secs.) */
selTimeout.tv_usec = 0; /* 0 microseconds */
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading
FD_SET(socket_desc, &readSet);//tcp socket
int numReady = select(3, &readSet, NULL, NULL, &selTimeout);
//IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD
if(numReady > 0){
char buffer[100] = {'\0'};
int bytesRead = read(socket_desc, &buffer, sizeof(buffer));
printf("bytesRead %i : %s", bytesRead, buffer);
if(bytesRead == 0){
running = FALSE;
printf("Shutdowning client.\n");
}
}
También como una nota, al seleccionar en múltiples sockets, debe verificar si el ID del socket se establece utilizando FD_ISSET – vmpstr
sí eso lo hizo Me siento tonto. FD_ISSET es el siguiente. – joels