2011-01-25 21 views
6

¿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"); 

     } 
    } 

Respuesta

8

El primer parámetro para seleccionar debe ser la máxima Identificación del zócalo más 1. Así pues, en su caso, debe ser

socket_desc+1 

Se puede tratar con eso y ver si funciona?

La razón por la que solo se obtiene cuando se presiona una tecla en el teclado es porque stdin es 0, que estaría dentro de 0 - (3 - 1) rango, que es lo que se marca. Si establece el primer parámetro en socket_desc + 1, entonces el rango 0 - (socket_desc) debe verificarse en los sockets listos

+1

También como una nota, al seleccionar en múltiples sockets, debe verificar si el ID del socket se establece utilizando FD_ISSET – vmpstr

+0

sí eso lo hizo Me siento tonto. FD_ISSET es el siguiente. – joels

Cuestiones relacionadas