2011-01-25 13 views
6

Jakieś pomysły, dlaczego, gdy serwer zapisuje gniazdo, gdy klient czeka na wybór, wybierz nigdy się nie kończy?przy użyciu opcji oczekiwania na dane w gnieździe klienta.

Używam c do komunikacji między gniazdami. Mój klient łączy się z moim serwerem grzywną.

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

Gdy używam recv do blokowania i nasłuchiwania danych, wszystko działa prawidłowo:

int bytesRead = 1; 
while(bytesRead){ 
    int bufsize=1024;   
    char *buffer=malloc(bufsize); 
    bytesRead = recv(socket_desc, buffer, bufsize, 0); 
    printf("CLIENT RECV: %s", buffer); 
} 

Jeśli próbuję użyć select, to nie wydaje się odczytać żadnych danych. Jeśli dodaję STDIN do fd_set, mogę zmusić go do odczytu z gniazda, ale wybór nie wydaje się być wyzwalany z odczytu socket_desc w danych ...?

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

     } 
    } 

Odpowiedz

8

Pierwszy parametr, aby wybrać powinna być maksymalna id gniazdo Plus 1. Tak więc w Twoim przypadku powinno być

socket_desc+1 

można spróbować z tym i sprawdzić, czy to działa?

Powód, który pojawia się tylko po naciśnięciu klawisza na klawiaturze, jest taki, że stdin ma wartość 0, która mieści się w zakresie 0 - (3 - 1), co jest zaznaczone. Jeśli ustawisz pierwszy parametr na socket_desc + 1, wówczas zakres 0 - (socket_desc) powinien być sprawdzony pod kątem gotowych gniazd

+1

Również przy notatce, przy wyborze na wielu gniazdach należy sprawdzić, czy identyfikator gniazda jest ustawiony za pomocą FD_ISSET – vmpstr

+0

tak to zrobiło. Czuję się głupio. FD_ISSET jest następny. – joels

Powiązane problemy