Module: Vagrant::Util::IsPortOpen

Included in:
Action::Builtin::HandleForwardedPortCollisions
Defined in:
lib/vagrant/util/is_port_open.rb

Overview

Contains the method #is_port_open? to check if a port is open (listening) or closed (not in use). This method isn't completely fool-proof, but it works enough of the time to be useful.

Instance Method Summary collapse

Instance Method Details

#is_port_open?(host, port) ⇒ Boolean

Checks if a port is open (listening) on a given host and port.

Parameters:

  • host (String)

    Hostname or IP address.

  • port (Integer)

    Port to check.

Returns:

  • (Boolean)

    true if the port is open (listening), false otherwise.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/vagrant/util/is_port_open.rb', line 16

def is_port_open?(host, port)
  # We wrap this in a timeout because once in awhile the TCPSocket
  # _will_ hang, but this signals that the port is closed.
  Timeout.timeout(1) do
    # Attempt to make a connection
    s = TCPSocket.new(host, port)

    # A connection was made! Properly clean up the socket, not caring
    # at all if any exception is raised, because we already know the
    # result.
    s.close rescue nil

    # The port is open if we reached this point, since we were able
    # to connect.
    return true
  end
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, \
       Errno::ENETUNREACH, Errno::EACCES, Errno::ENOTCONN, \
       Errno::EADDRNOTAVAIL
  # Any of the above exceptions signal that the port is closed.
  return false
end