2012-05-02 2 views
1

select()를 사용하여 실험하는 동안 이상한 결과가 나타납니다.select가 무한정 기다리는 중임

fd_set tempset,set; //set of descriptors 

FD_ZERO(&set); //initialize descriptor set to NULL 

FD_SET(serversock,&set); //add server's socket to descriptor set 'set' 

timeout.tv_sec=2; 
timeout.tv_usec=0; 

while(1){ 

tempset=set; 
timeout.tv_sec=2; 
timeout.tv_usec=0; 

printf("%s","Waiting on select\n"); 

int ret=select(FD_SETSIZE,&tempset,NULL,NULL,&timeout); 

if(ret==0) printf("timeout "); 

else if(ret==-1){ 
    printf("Error occured\n"); 
    exit(0); 
} 

else if(ret>0){ //socket ready for reading 

    for(i=0;i<FD_SETSIZE;i++){ 

    if(FD_ISSET(i,&tempset)){ //check if it's serversock 

     if(i==serversock){ 
       //accept connection and read/write 
       printf("Client connected\n"); 

    }//i==serversock close 

    } 
}//for ends 
} 

printf ("% s", "Waiting on select \ n"); select는 무한정 대기합니다. 그러나 라인을 다시 삽입하면 모든 것이 예상대로 작동합니다 (클라이언트 연결로 테스트 됨)

내가 놓친 것이 있습니까?

미리 감사드립니다.

+0

당신은이 루프에서 선택한 각 호출하기 전에 설정 파일 설명을 다시 초기화해야합니다. –

+0

stdio 버퍼링 효과가있을 수 있습니다. "timeout"메시지, 즉'printf ("timeout \ n");'에 줄 바꿈을 추가하고 관찰 내용을 변경하는지 확인하십시오. 'select()'는 실제로 2 초마다 시간을 초과하지만 실제로는'printf'가'stdout' 라인 버퍼를 내 보내지 않으면 그것을 볼 수 없을 것입니다. – Celada

+0

예, 시간 초과 후 새 행을 추가하면 트릭을 수행합니다. 감사! select가 작동하려면 stdout을 플러시해야하는 이유는 무엇입니까? – Karan

답변

3

당신은 전혀 사용하지 말아야하는 FD_SETSIZE을 오용하고 있습니다. 하나의 소켓을 fd_set에 끼워 넣기 때문에 루프를 돌릴 필요가 전혀 없습니다 (하지만 필요한 경우 fd_set.fd_count 멤버를 대신 사용하십시오).

이 시도 :

fd_set set; 
timeval timeout; 

while(1){ 
    FD_ZERO(&set); 
    FD_SET(serversock, &set); 

    timeout.tv_sec = 2; 
    timeout.tv_usec = 0; 

    printf("%s","Waiting on select\n"); 

    int ret = select(serversock+1, &set, NULL, NULL, &timeout); 

    if (ret==0){ 
     printf("timeout "); 
    } 

    else if (ret==-1){ 
     printf("Error occured\n"); 
     exit(0); 
    } 

    else if (ret>0){ //socket ready for reading 
     ... = accept(serversock, ...); 
     printf("Client connected\n"); 
    } 
} 

또는를 :

fd_set set; 
timeval timeout; 
int max_fd = 0; 

while(1){ 
    FD_ZERO(&set); 

    FD_SET(serversock, &set); 
    max_fd = serversock; 

    // FD_SET() other sockets and updating max_fd as needed... 

    timeout.tv_sec = 2; 
    timeout.tv_usec = 0; 

    printf("%s","Waiting on select\n"); 

    int ret = select(max_fd+1, &set, NULL, NULL, &timeout); 

    if (ret==0){ 
     printf("timeout "); 
    } 

    else if (ret==-1){ 
     printf("Error occured\n"); 
     exit(0); 
    } 

    else if (ret>0){ //socket(s) ready for reading 
     for (u_int i = 0; i < set.fd_count; ++i){ 
      ... = accept(set.fd_array[i], ...); 
      printf("Client connected\n"); 
     } 
    } 
} 
관련 문제