Search code examples
rubysocketsconnection-timeout

Shortening socket timeout using Timeout::timeout(n) does not seem to work for me


I found what I thought should work perfectly at https://stackoverflow.com/questions/517219?tab=oldest#tab-top but, it did not work for me.

I have Ruby 1.9.1 installed on Windows and, when I try the example "is_port_open" test, it does not work. The socket call still takes around 20 seconds to timeout no matter what value I set for the timeout. Any ideas why?


Solution

  • The following code seems to work with ruby 1.9.1 on Windows:

    require 'socket'
    
    def is_port_open?(ip, port)
      s = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
      sa = Socket.sockaddr_in(port, ip)
    
      begin
        s.connect_nonblock(sa)
      rescue Errno::EINPROGRESS
        if IO.select(nil, [s], nil, 1)
          begin
            s.connect_nonblock(sa)
          rescue Errno::EISCONN
            return true
          rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
            return false
          end
        end
      end
    
      return false
    end
    

    I haven't figured out yet why the original is_port_open?() code doesn't work on Windows with ruby 1.9.1 (it works on other OSes).