Мне нужен быстрый способ узнать, открыт ли данный порт в Ruby. В настоящее время я возился с этим:
require 'socket'
def is_port_open?(ip, port)
begin
TCPSocket.new(ip, port)
rescue Errno::ECONNREFUSED
return false
end
return true
end
Это прекрасно работает, если порт открыт, но недостатком этого является то, что иногда он просто будет сидеть и ждать 10-20 секунд, а затем в конечном итоге истечет время, выдавая исключение ETIMEOUT
(если порт закрыт) , Мой вопрос таков:
Можно ли изменить этот код так, чтобы он ожидал только секунду (и возвращает false
, если к тому времени мы ничего не получим) или есть лучший способ проверить, открыт ли данный порт на данном хосте?
Редактировать: Вызов bash-кода также допустим, если он работает кроссплатформенно (например, Mac OS X, * nix и Cygwin), хотя я предпочитаю код Ruby.