特定のホストが稼働中で、特定のポートをリッスンしているかどうかを確認し、エラーを正しく処理しようとしています。
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
これを行うより良い方法はありますか?