Мне нужен быстрый способ узнать, открыт ли данный порт 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.