闭合插座不';我不能用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吗?代码在没有它的情况下可以正常工作,但我以为你应该关闭你的套接字。