我正在尝试通过实施更多错误处理来创建更好的端口扫描程序,并且我遇到了一些麻烦。
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;而不是打印一次然后关闭套接字。我明显做错了,但在网上我发现简单的代码以这种方式关闭套接字连接。
答案 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
)进行了测试,也会出现错误。当您在其他网络中运行代码时,您必须要小心,因为您可能会得到不同的结果。