关闭套接字在Ruby中不起作用

时间:2014-05-26 00:32:14

标签: ruby

我正在尝试通过实施更多错误处理来创建更好的端口扫描程序,并且我遇到了一些麻烦。

    def pscan(host_name, port)
        begin
            sock = Socket.new(:INET, :STREAM)
            raw = Socket.sockaddr_in(port, host_name)
            if sock.connect(raw)
                puts "Port #{port} is up!"
            rescue (Errno::ECONNREFUSED)
                false
            rescue (Errno::ETIMEDOUT)
                puts "Port #{port} timed out!"
      end
end

def run
    port = 1
    begin
        while port <= ARGV[1].to_i do
            popen(ARGV[0], port)
            port += 1
        end

        rescue (Errno::EHOSTUNREACH)
                puts "No path to host"

        rescue(Interrupt)
            puts " Process interrupted"
    end
end


run

问题是,对于扫描的每个端口,它将打印&#34;没有主机路径#34;而不是打印一次然后关闭套接字。我明显做错了,但在网上我发现简单的代码以这种方式关闭套接字连接。

2 个答案:

答案 0 :(得分:1)

我认为您忘了关闭if语句。另外,使用&#39;确保&#39;关闭它。 试试这个:

def pscan(host_name, port)
    begin
    sock = Socket.new(:INET, :STREAM)
    raw = Socket.sockaddr_in(port, host_name)
    if sock.connect(raw)
        puts "Port #{port} is up!"
    end

    rescue (Errno::ECONNREFUSED)
        false
    rescue (Errno::ETIMEDOUT)
        puts "Port #{port} timed out!"
    rescue (Errno::EHOSTUNREACH)
        puts "No path to host"
    ensure
        sock.close
    end
end

答案 1 :(得分:0)

就像您在评论和代码更改中提到的那样,您必须将套接字关闭移动到调用代码的块中,而不是在代码本身内部,因为代码块将不断调用方法和套接字永远不会被关闭。

您基本上必须执行您在代码中发布的内容:

require 'socket'

def pscan(host_name, port)
  begin
  sock = Socket.new(:INET, :STREAM)
  raw = Socket.sockaddr_in(port, host_name)
  if sock.connect(raw)
    puts "Port #{port} is up!"
  end
  rescue (Errno::ECONNREFUSED)
    puts "Connection refused to port #{port}"
    false
  rescue (Errno::ETIMEDOUT)
    puts "Port #{port} timed out!"
    false
  end
end

def run
  puts "Attempting to scan host #{ARGV[0]}"
  port = 1
  begin
  while port <= ARGV[1].to_i do
    pscan(ARGV[0], port)
    port += 1
  end
  rescue (Errno::EHOSTUNREACH)
    puts "No path to host #{ARVG[0]}"
  rescue(Interrupt)
    puts "Process interrupted"
  end
end

run

一些想法:你可能并不总是得到&#34;没有主持人的路径&#34;运行代码时出错;当我在我的网络中测试它时,我从未得到过#34;没有主机的路径&#34;错误,但总是得到一个&#34;端口......超时!&#34;即使我针对已知无法访问的主机(例如10.0.0.1)进行了测试,也会出现错误。当您在其他网络中运行代码时,您必须要小心,因为您可能会得到不同的结果。