class SimplePortSniff
Public Class Methods
new( ip, ports )
click to toggle source
# File lib/simplePortSniff/simpleportsniff.rb, line 5 def initialize( ip, ports ) @ip = ip @ports = ports end
Public Instance Methods
connect( host, port, timeout = 5 )
click to toggle source
this function modified from original at: spin.atomicobject.com/2013/09/30/socket-connection-timeout-ruby/
# File lib/simplePortSniff/simpleportsniff.rb, line 11 def connect( host, port, timeout = 5 ) # Convert the passed host into structures the non-blocking calls # can deal with addr = Socket.getaddrinfo(host, nil ) sockaddr = Socket.pack_sockaddr_in( port, addr[0][3] ) Socket.new(Socket.const_get( addr[0][0]), Socket::SOCK_STREAM, 0 ).tap do |socket| socket.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 ) begin # Initiate the socket connection in the background. If it doesn't fail # immediatelyit will raise an IO::WaitWritable (Errno::EINPROGRESS) # indicating the connection is in progress. socket.connect_nonblock( sockaddr ) rescue IO::WaitWritable # IO.select will block until the socket is writable or the timeout # is exceeded - whichever comes first. if IO.select( nil, [socket], nil, timeout ) begin # Verify there is now a good connection socket.connect_nonblock( sockaddr ) rescue Errno::EISCONN # Good news everybody, the socket is connected! return "port #{port} is open" rescue # An unexpected exception was raised - the connection is no good. socket.close return "port #{port} is closed" #raise end else # IO.select returns nil when the socket is not ready before timeout # seconds have elapsed socket.close return "port #{port} is closed" #raise "Connection timeout" end end end end
sniff()
click to toggle source
# File lib/simplePortSniff/simpleportsniff.rb, line 53 def sniff() rtn = [] @ports.each do |item| rtn.push( connect( @ip, item, 1 ) ) end return rtn.join("\n") end