2012-03-21 16 views
4

私はselect()APIのタイムアウトパラメータとして最大20秒しか設定できませんでした。どのような私は20の上方与えた値が、(選択)が私を助けてくださいので、私はこのタイムアウトのためのselect()の使用

int timeoutcount = 0; 
    do 
    { 
    FD_ZERO(&fd); 
    FD_SET(sock,&fd); 
    timeout.tv_sec = 20; 
    timeout.tv_usec = 0; 
    rc = select (sock+1,&fd,null,null,&timeout); 
    if(rc ==0) 
    timeoutcount += 20; 
    } 
    while(rc ==0 && timeoutcount <60) 

のような1分間のタイムアウトのループを記述しようとしていた ... 20秒そのもの後に戻っています...私は正しい方法で行っていますか? もしそうなら、最初timeout..help後の選択に戻り1は私があまりにも 注これを理解:私は客観Cで

+0

「靴下」にはタイムアウトしていません。 – nos

+0

@nos私が初めて試していたとき、タイムアウトを60秒に設定しました。自分のネットワークケーブルが抜かれていても、20秒後にイベントを「靴下」に持ってきました。その後、タイムアウトを20秒にしたとき、正しく動作していました。 – Kesav

+0

まあ、ソケットイベントを処理する必要があります。ケーブルが抜かれているかどうかは関係ありません。あなたが何をしているのかによって、プラグが抜かれているか、ソケットレベルで何かがタイムアウトしているという事実があるため、イベントが発生するかもしれません。 selectは、ソケットにイベントがあるか、タイムアウトが発生したかを返します。 select()は宣言されたとおりに動作します。ソケットイベントを処理しない場合、次にそのソケットでselectを呼び出すと同じイベントが発生します。 – nos

答えて

7

を、それを使用していタイムアウトが選択するための20秒の最大値はありません - 何かを(おそらくデータがあなたのソケットで読み込み可能になっている)、select()を早期に返す必要があったに違いありません。あなたが本当に睡眠の手段としてselect()を使いたい場合は、次のように呼び出してみてください:

struct timeval tv = {600, 0}; // sleep for ten minutes! 
if (select(0, NULL, NULL, NULL, &tv) < 0) perror("select"); 
+0

私はスリープ機能として選択機能を使用しません。タイムアウトのイベントのためにソケット上で待機する必要があります。 – Kesav

+0

select()は、登録されたソケットでイベントが発生するとすぐに戻ります。ソケットイベントが発生しない場合は、タイムアウト値で示された時間が経過した後に戻ります。したがって、ソケットイベントを処理し、タイムアウトを取得する場合は、発生したソケットイベントを処理してから、select()を後で(タイムアウト値を適切に減らして)再度呼び出す必要があります。 –

+0

私は基本的な疑いがあります。ネットワーク接続がなくてもSelect()が何らかのイベントを返しますか? – Kesav

関連する問題