Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如果连接可以';不可能吗?_Ruby_Sockets - Fatal编程技术网

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

我正在用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 |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连接无法建立或异常情况不太严重时的回调。当问题不是一个真正的异常问题时,异常具有回溯和其他在这种情况下没有意义的信息。