我正在尝试检查给定主机是否已启动、运行和侦听特定端口,并正确处理任何错误。
我发现了许多关于 Ruby 套接字编程的参考资料,但似乎没有一个能够有效地处理“套接字超时”。我试过IO.select
了,它有四个参数,其中最后一个是超时值:
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
有没有更好的方法来做到这一点?