2012-05-02 6 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")行を削除します。選択は無期限に待機し続けます。しかし、私がラインを再挿入すると、すべてが正常に動作します(クライアント接続でテストされます)

私に何か不足していますか?

ありがとうございます!

+0

あなたはこのループで選択するために各呼び出し前に設定ファイルディスクリプタを再初期化する必要があります。 –

+0

stdioバッファリングの効果があるかもしれません。 "timeout"メッセージに改行を追加してください( 'printf(" timeout \ n ");')。あなたの 'select()'は実際には2秒ごとにタイムアウトしていますが、 'stdout'行バッファーをフラッシュする' printf'がなければ見えません。 – Celada

+0

はい、タイムアウト後に新しい行を追加すると、そのトリックが実行されます。ありがとう! しかし、selectを動作させるためにstdoutをフラッシュする必要があるのはなぜですか? – Karan

答えて

3

FD_SETSIZEを誤って使用しているため、まったく使用しないでください。 1つのソケットを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"); 
     } 
    } 
}