Ruby 如果连接可以';不可能吗?
我正在用Ruby编写一个简单的网络分析器,希望尝试连接到计算机上的所有端口:Ruby 如果连接可以';不可能吗?,ruby,sockets,Ruby,Sockets,我正在用Ruby编写一个简单的网络分析器,希望尝试连接到计算机上的所有端口: (1..65535).each do |port| socket = TCPSocket.new('127.0.0.1', port) end 问题是当端口未连接时,我会收到一个Ruby错误: Errno::ECONNREFUSED: Connection refused - connect(2) for "127.0.0.1" port 1 我知道我可以捕捉到异常: (1..65535).each do
(1..65535).each do |port|
socket = TCPSocket.new('127.0.0.1', port)
end
问题是当端口未连接时,我会收到一个Ruby错误:
Errno::ECONNREFUSED: Connection refused - connect(2) for "127.0.0.1" port 1
我知道我可以捕捉到异常:
(1..65535).each do |port|
begin
socket = TCPSocket.new('127.0.0.1', port)
rescue => ex
puts "problem: #{ex}"
end
end
但出于这个目的使用异常感觉有点难看。。。知道我将无法连接到大多数端口。有没有更好的方法来处理这个问题?Inline Rescue
您可能只是忽略带有内联rescue的未打开套接字。例如:
require 'socket'
sockets =
(1..65535).map { |port| TCPSocket.new('127.0.0.1', port) rescue nil }.compact
您仍然在拯救异常,但实际上您是在将其丢弃,因为它与您无关。然后,您可以使用存储在套接字中的打开套接字数组执行操作。例如:
sockets.map &:addr
当您无法连接端口时,您的目标是什么?您希望发生什么?这就是异常设计的目的(即错误处理)。我希望有一个选项可以指定在TCP连接无法建立或异常情况不太严重时的回调。当问题不是一个真正的异常问题时,异常具有回溯和其他在这种情况下没有意义的信息。