我需要一个快速的方法来确定给定的端口是否用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
)还是有更好的方法来检查给定端口是否在给定主机上打开?
编辑:尽管我更喜欢Ruby代码,但只要它可以跨平台工作(例如,Mac OS X,* nix和Cygwin),调用bash代码也是可以接受的。
就像一个魅力!谢谢! – 2009-02-05 20:36:47
我遇到了阻塞问题(我认为)。基本上超时不会超时。不知道为什么,但netcat解决方案在其位置上运行良好。 – 2011-10-27 16:26:52
此答案有一个也适用于Windows的解决方案:http://stackoverflow.com/a/3473208/362951 – mit 2012-07-08 20:22:25