From: Evan Light Date: 2007-05-08T00:15:05+09:00 Subject: Re: Why is my method not found? (NoMethodError) Your problem is that there is way too much nesting within your methods. You lost track of which "end" maps to which "do" and "begin" in numerous places. As a general rule, if you're nesting more than two levels deep within a method, you just made your method a lot more difficult to maintain. The below version fixes your nesting issues (but does not correct them for maintainability). require 'socket' require 'timeout' class Scanner def initialize @hosts,@ports = Array($*) end def portarrange case @ports when /^.+[..]/ @ports = @ports.split("..") @ports = @ports[0].to_i..@ports[1].to_i when /^.+[,]/ @ports = @ports.split(",") else @ports = Array(@ports) end end def hostarrange case @hosts when /^.+[,]/ @hosts = @hosts.split(",") else @hosts = Array(@hosts) end end def output(state,port) printed = false portsfile = File.new("ports", "r") scanpat = "^.+ #{port}/tcp" begin portsfile.each_line do |line| if line =~ Regexp.new(scanpat) puts "#{state} : #{line}" printed = true end puts "#{state} : #{port}" if printed == false end ensure portsfile.close end end def scanning(hosts,ports) hosts.each do |host| begin puts "scanning #{host}:" ports.each do |port| begin Timeout::timeout(10){TCPSocket.new(host, port)} rescue Timeout::Error output("filtered",port) rescue output("closed",port) else output("open",port) end end end end end end ##################### code start ##################### puts "no arguments past,correct usage:\nruby #{$0} [hosts] [ports]\n" if !ARGV[1] my_scanner = Scanner.new hosts = my_scanner.hostarrange ports = my_scanner.portarrange =begin puts "debugging: " puts hosts puts ports # everything alright until here =end my_scanner.scanning(hosts,ports) ##################### eof #####################