https://stackoverflow.com/questions/517219?tab=oldest#tab-topで完全に機能すると思われるものを見つけましたが、うまくいきませんでした。
Windows に Ruby 1.9.1 をインストールしましたが、例の「is_port_open」テストを実行しても機能しません。タイムアウトに設定した値に関係なく、ソケット呼び出しのタイムアウトには約 20 秒かかります。理由はありますか?
https://stackoverflow.com/questions/517219?tab=oldest#tab-topで完全に機能すると思われるものを見つけましたが、うまくいきませんでした。
Windows に Ruby 1.9.1 をインストールしましたが、例の「is_port_open」テストを実行しても機能しません。タイムアウトに設定した値に関係なく、ソケット呼び出しのタイムアウトには約 20 秒かかります。理由はありますか?
次のコードは、Windowsのruby1.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でも機能します)。
これは、Ruby Timeout ライブラリに固有の問題が原因である可能性があります。これは、基盤となるソケット ライブラリに直接アクセスし、Socket でタイムアウトを設定することで実現できます。この記事ではこれについてある程度詳しく説明しますが、*nix を想定しているため、Windows で問題が発生する可能性があります。ソケットの実装がどの程度似ているかはわかりません。