2011-10-27 9 views
1

私はC++で書かれたサーバ上で簡単なログインのタイムアウトを書いています。 まあ、これはコードです:C++でのログインにタイムアウトを設定する方法は?

char username[this->BUFSIZE]; 
    clean(username); 
    char password[this->BUFSIZE]; 
    clean(password); 
    send(client_fd, "USER", 4, 0); 

    //Start timer 
    time_t end,start; 
    double dif; 
    time (&start); 

    recv(client_fd,username,BUFSIZE,0); 
    send(client_fd, "PASS", 4, 0); 
    recv(client_fd,password,BUFSIZE,0); 

    //End timer 
    time (&end); 
    dif = difftime (end,start); 
      //If dif>10 seconds disconnect the client. 
    if(dif>10) 
     close(client_fd); 

[OK]を、それが正常に動作しますが、ちょうど問題がある:切断は、クライアント側は、ユーザー+パスワードを入力した場合にのみ発生します。私の目標は、タイマーは、クライアントがログインをしたかどうかに関わらず、10秒で接続を閉じる必要があるということです。

可能ですか? ありがとうございました!

+0

「ハウスキーピング」スレッドが必要で、バックグラウンドを実行し、ユーザーの操作に関係なくセッションをチェックして無効にするように聞こえます。 – trojanfoe

答えて

0

信号SIGALRMを使用して、recvと入力する前にこれを設定し、接続を閉じるタイミングを設定します。

代わりにあなたはclient_fd上のデータを待つselect()を使用することができますなど

2

をタイマーを提供するようASIOなど全脂のフレームワークを使用します。 selectはタイムアウト値をサポートしており、タイムアウトが発生した場合は0を返します。データが準備されている場合、selectはデータ保留中のディスクリプタの数を返します。

1

ソケットオプションSO_RCVTIMEOtimeval構造に設定することもできます。これにより、タイムアウトが発生するとrecvが復帰します。

関連する問題