0

特定のホストが稼働中で、特定のポートをリッスンしているかどうかを確認し、エラーを正しく処理しようとしています。

Ruby ソケット プログラミングの参考文献をいくつか見つけましたが、「ソケット タイムアウト」を効率的に処理できるものはないようです。を試しIO.selectました。これは 4 つのパラメーターを取り、そのうちの最後のパラメーターはタイムアウト値です。

IO.select([TCPSocket.new('example.com', 22)], [nil], [nil], 4)

問題は、特にポート番号が間違っているか、サーバーがリッスンしていない場合にスタックすることです。それで、最終的に私はこれになりました。これはあまり好きではありませんでしたが、仕事をしています:

require 'socket'
require 'timeout'
dns = "example.com"

begin
    Timeout::timeout(3) { TCPSocket.new(dns, 22) }
    puts "Responded!!"
    # do some stuff here...
rescue SocketError
    puts "No connection!!"
    # do some more stuff here...
rescue Timeout::Error
    puts "No connection, timed out!!"
    # do some other stuff here...
end

これを行うより良い方法はありますか?

4

2 に答える 2

1

リソースの可用性を確認する最善の方法は、実際に使用してみることです。追加のコードを追加して、使用が機能するかどうかを事前に予測しようとすると、必ず失敗します。

  1. 間違ったことをテストすると、別の答えが得られます。
  2. 正しいことを間違ったタイミングでテストすると、テストと使用の間で答えが変わり、アプリケーションは無駄に 2 倍の作業を実行し、冗長なコードを記述します。
  3. テストの失敗を処理するために作成する必要があるコードは、使用の失敗を処理するために作成する必要があるコードと同じです。なぜそれを2回書くのですか?
于 2013-07-30T23:52:00.870 に答える
0

システムの 1 つで Net::SSH を広範囲に使用し、タイムアウトの問題に遭遇しました。

おそらく最大の修正は、selectメソッドの使用を実装し、低レベルのタイムアウトを設定し、スレッドベースの Timeout クラスを使用しないようにすることでした。

Ruby でソケット タイムアウトを設定するにはどうすればよいですか?」と「SO_RCVTIMEO ソケット オプションを介して Ruby でソケット タイムアウトを設定する」には、そのために調査するコードがあります。また、有用なコードを持つ「 Ruby のソケット タイムアウト」へのリンクの 1 つですが、Ruby 1.8.6 用に書かれていることに注意してください。

Ruby のバージョンによっても違いが生じる可能性があります。1.9 より前のスレッドでは、ブロックしている IP セッションを停止できなかったため、ソケットがタイムアウトになるまでコードがハングし、タイムアウトが発生しました。上記の質問は両方ともそれを超えています。

于 2013-07-31T14:02:42.680 に答える