2


2

Timeout :: timeout(n)を使用してソケットのタイムアウトを短縮することはうまくいかないようです

私はhttps://stackoverflow.com/questions/517219?tab=oldest#tab-topで完璧に機能するはずだと思ったものを見つけましたが、私には機能しませんでした。

Ruby 1.9.1をWindowsにインストールしていますが、サンプルの「is_port_open」テストを試しても動作しません。 タイムアウトに設定した値に関係なく、ソケットコールはタイムアウトまで約20秒かかります。 何かアイディアは?

2 Answer


5


次のコードは、Windows上のruby 1.9.1で動作するようです。

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

元のis_port_open?()コードがruby 1.9.1を使用するWindowsで動作しない理由はまだわかりません(他のOSで動作します)。


0


これは、Rubysタイムアウトライブラリに固有の問題が原因である可能性があります。 これは、基になるソケットライブラリに直接アクセスし、ソケットにタイムアウトを設定することで実現できます。 このhttp://www.mikeperham.com/2009/03/15/socket-timeouts-in-ruby/[article]では、これについてある程度詳しく説明していますが、* nixを前提としているため、Windowsで問題が発生する可能性があります。 mソケットの実装がどれほど似ているかわからない。