我需要一个快速的方法来确定一个给定的端口是否在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代码。