Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/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 - Fatal编程技术网

闭合插座不';我不能用Ruby工作

闭合插座不';我不能用Ruby工作,ruby,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} i

我试图通过实现更多的错误处理来创建更好的端口扫描程序,但遇到了一些麻烦

    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
def pscan(主机名、端口)
开始
sock=Socket.new(:INET,:STREAM)
raw=Socket.sockaddr\u in(端口、主机名)
if sock.connect(原始)
显示“端口#{Port}已启动!”
救援(错误号::经济恢复)
假的
救援(错误号::ETIMEDOUT)
将“端口#{Port}超时!”
结束
结束
def运行
端口=1
开始

而port我认为您忘了关闭if语句。此外,请使用“确保”将其关闭。 试试这个:

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

正如您在注释和代码更改中提到的,您必须将套接字移到调用代码的块中,而不是移到调用代码的块中,因为代码块将不断调用方法,套接字实际上永远不会关闭

基本上,您必须按照您在代码中发布的内容进行操作:

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
需要“套接字”
def pscan(主机名称、端口)
开始
sock=Socket.new(:INET,:STREAM)
raw=Socket.sockaddr\u in(端口、主机名)
if sock.connect(原始)
显示“端口#{Port}已启动!”
结束
救援(错误号::经济恢复)
放置“拒绝连接到端口#{port}”
假的
救援(错误号::ETIMEDOUT)
将“端口#{Port}超时!”
假的
结束
结束
def运行
放置“正在尝试扫描主机#{ARGV[0]}”
端口=1
开始

使用pscan的一些示例是什么?例如,我复制了您的原始代码,然后输入了
pscan('http://www.google.com,80)
我得到了
端口80:up
。由于您的
if
语句,您当前的代码不起作用;在
放置“端口#{Port}启动!”
后放置
结束
,以使其再次工作。对不起,我不确定是否理解您的问题。我应该发布整个代码吗?这只是一个代码片段不,请给出一些示例,说明您正在做什么或如何使用此代码。当我尝试它时,它似乎起了作用。在原来的帖子中添加了一些必要的代码。因此,由于它通过输入主机名和结束端口号来工作,因此它将从1开始扫描每个端口,直到指定任何端口为止。因此,如果我扫描家庭网络上未启动的主机(./portscanner 10.0.0.90 100),而不是打印“无主机路径”并因sock.close而结束,它将为每个端口打印“无主机路径”,最多100个。修复了它!我将EHOSTUNREACH异常放在第二个方法中,现在它可以工作了。更新原始邮政编码。代码中不应该有某种Socket.close吗?代码在没有它的情况下可以正常工作,但我以为你应该关闭你的套接字。