2012-04-01 3 views
2

私のプログラムでは、(select関数を使用して)最大4つの接続を受け入れます。接続が完了すると、5秒間文字列を送信して、接続を維持したいことを示します。 5秒以内に送信しないか、間違ったパスコードを持つものは切断されます。Cの接続のタイムアウト

接続が確立されるたびにフォークされる小さなタイマープログラムを作成しました。フォークされたタイマーは、5秒が経過すると元のプログラムに信号を返します。この場合、シグナルハンドラはファイル記述子を閉じ、接続をクリアします。

私の問題は、シグナルハンドラがトリガされるたびに、select()は-1が返って失敗したことを示します。誰がなぜこれが起こっているのか知っていますか?それとも、別のタイミング機構があるのでしょうか?

+1

selectが-1を返すとき、errnoとは何ですか?それがあなたの最大のヒントです。 – Duck

答えて

0

私はこれが意図された動作であると信じていますselect():シグナルが発生した場合にerrnoが適切に設定された状態で-1を返します。

私はスレッドがここに行く方法だとは思わない。私はあなたが(Javaの風のネーミングを容赦が、あなたはポイントを得る)大体このような構造を持つプログラムをしたいと仮定します。

int fdsThatResponded[FDCOUNT]; 
memset(fdsThatResponded, 0, sizeof(int)*FDCOUNT); 

while (time_elapsed < 5) { 
    ret = select(......); 
    if (-1 == ret) { 
     handleError(); 
    } 
    checkWhichFdAndHandleAppropriately(); 
    reinitializeTimerForSelectWithRemainingTime(); 
} 

は全くその助けをしていますか?

1

代わりに役に立たないスレッドを生成する

おかげで、ちょうど各ソケットに関連lastRecvdフィールドを保持します。その後、select()に5秒のタイムアウトを与えます。選択後、選択リストにないソケットがあれば、5秒かどうかを確認する必要があります。

現在のコードではなぜ失敗しているのかは、ファイル記述子の1つが無効になっているためです。 errnoを確認して、それがEBADFかどうかを確認してください。