我需要一个快速的方法来确定一个给定的端口是否用Ruby打开.我目前正在摆弄这个:
require 'socket'
def is_port_open?(ip, port)
begin
TCPSocket.new(ip, port)
rescue Errno::ECONNREFUSED
return false
end
return true
end
Run Code Online (Sandbox Code Playgroud)
如果端口是打开的,它的效果很好,但是它的缺点是它偶尔会坐下等待10-20秒然后最终超时,抛出ETIMEOUT异常(如果端口关闭).我的问题是:
可以将此代码修改为仅等待一秒钟(false如果我们当时没有得到任何回报,则返回)或者是否有更好的方法来检查给定端口上的给定端口是否打开?
编辑:只要它跨平台工作(例如,Mac OS X,*nix和Cygwin),调用bash代码也是可以接受的,尽管我更喜欢Ruby代码.
$ irb
1.9.3-p448 :001 > require 'socket'
=> true
1.9.3-p448 :002 > TCPSocket.new('www.example.com', 111)
Run Code Online (Sandbox Code Playgroud)
给
Errno :: ETIMEDOUT:操作超时 - 连接(2)
问题:
TCPSocket.new?