ruby用socket扫描端口

  1. require 'socket'
  2. include Socket::Constants
  3. def scan_port
  4. if $*[0] == nil or $*[1] == nil or $*[2] == nil
  5. abort "用法示例:ruby #$0 ip地址 开始端口 结束端口 EX:如ruby #$0 localhost 1 1024"
  6. end
  7. time = Time.now
  8. scan $*[0], $*[1], $*[2]
  9. puts "\n共耗时:#{Time.now - time}秒"
  10. end
  11. private
  12. def scan(address, start_port, end_port)
  13. threads = []
  14. for port in start_port..end_port
  15. threads << Thread.new(port) do |theport|
  16. begin
  17. socket = Socket.new(AF_INET, SOCK_STREAM, 0) #生成新的套接字
  18. sockaddr = Socket.pack_sockaddr_in(theport, address)
  19. socket.connect(sockaddr)
  20. puts "Port:#{theport} is Opend!\n"
  21. socket.close
  22. rescue
  23. end
  24. end
  25. end
  26. threads.each {|thr| thr.join}
  27. end