2012-04-06 10 views
1

私は、GPRSモジュールから作成されたソケットを扱うためのRubyサーバを実装しています。問題は、モジュールの電源が切れたときに、ソケットが閉じていることを示すものではありません。"ウォッチドッグ"付きRubyスレッド

同じサーバーで複数のソケットを処理するスレッドを実行しています。私は何を求めているのですか:スレッド内でタイマーを使用し、ソケットの入力ごとにリセットし、タイムアウトに達した場合はスレッドを閉じる方法がありますか?これについての詳しい情報はどこにありますか?

EDIT:コード例

require 'socket' 

server = TCPServer.open(41000) 
loop do 
    Thread.start(server.accept) do |client| 
     puts "Client connected" 

     begin 
      loop do 
       line = client.readline 

       open('log.txt', 'a') { |f| 
        f.puts line.strip 
       } 
      end 
     rescue 
      puts "Client disconnected" 
     end 
    end 
end 
+0

を使用し、[eventmachine](https://github.com/eventmachine/eventmachine)!それは♥なので。 – omninonsense

+0

この場合、イベントマシンのヘルプはどのように役立ちますか? –

+0

あなたは本当に閉じたソケットを伝えることはできません。アプリケーションがソケットが閉じていることが通知されるまで数時間、数日、そして数か月かかることがあります。クライアント(GPRSモジュール)とサーバーの間でping-bongする必要があります。 – omninonsense

答えて

1

を閉じるソケットを検出していない私はあなたのハートビート・メカニズムが必要だと思います。

+0

あなたはさらに説明できますか? –

0

リモートエンドによって閉じられたときに発生した例外をキャッチしていないため、あなたのソケットは不可能に閉じています。

例外ハンドリングブロックで接続ハンドラをラップする必要があります。

使用しているモジュール/モデルがわからないと、私はちょうどファッジして、あなたにはprocess_connectionルーチンがあると言います。したがって、次のようなことをする必要があります。

def process_connection(conn) 
    begin 
     # do stuff 
    rescue Exception => e 
     STDERR.print "Caught exception #{e}: #{e.message}\n#{e.backtrace}\n" 
    ensure 
     conn.close 
    end 
end 

これは、すべての例外を捕捉し、スタックトレースを使用してstderrにダンプします。そこからあなたは何が原因であるのかを知ることができ、おそらく他の場所でより優雅に扱うことができます。

+0

私はここに来る前にそれを試しました...しかし役に立たない...ソケットは閉じないように見えます... –

+0

それから私は推測できません。いくつかのコードを表示してください。 –

0

だけstandarのAPIのタイムアウトチェック:

​​
関連する問題