Ruby One班轮|测试远程主机端口

时间:2014-06-02 07:19:57

标签: ruby sockets

我正在尝试使用Ruby中的Perl命令

的Perl

perl -MIO::Socket::INET -e 'until(new IO::Socket::INET("localhost:80")) { print "Waiting for network..\n"; sleep 1}'

我如何在红宝石中做同样的事情?

我试过了:

require 'socket'
until !( TCPSocket.new("localhost",80).close ) do
        puts "Wait..."
        sleep 1
end

我正在寻找Ruby中的一个班轮。

2 个答案:

答案 0 :(得分:3)

主要区别在于,如果无法建立IO,Ruby将引发错误,因此您需要解决错误情况。它稍微改变了流程,但仍然非常可行:

loop { break if (TCPSocket.open("localhost",80) rescue nil); puts "Wait...."; sleep 1 }

从其他答案可以看出,可以从Perl版本进行更直接的转换。只需使用Ruby表达式(TCPSocket.open("localhost",80) rescue nil)替换Perl的new IO::Socket::INET("localhost:80"),以便Ruby的引发错误行为更好地匹配Perl的在无法创建对象时返回undef

答案 1 :(得分:3)

这是类似的:

require 'socket'
(puts "Waiting..."; sleep 1) until (TCPSocket.open("localhost",3000) rescue nil)

完整命令行:

ruby -r socket -e '(puts "Waiting..."; sleep 1) until (TCPSocket.open("localhost",3000) rescue nil)'