動かざることバグの如し

殿、温めておいたバグがこちらでございます

Rubyでポートが開放されているか確認する方法

単純にそのホストのポートがListenしてるかの確認はソケット接続を使うとサクッといける

コード

require "socket"
begin
    s = TCPSocket.open('example.com', 80)
rescue
    puts 'ng'
else
    puts 'ok'
ensure
    s.close
end

ポイントは2つ。

  • 接続できなかったときは例外が発生するので、beginで処理する必要がある
  • 最後はclose

irb上だと以下のような挙動

irb(main):001:0> require "socket"
=> true
irb(main):002:0> s = TCPSocket.open('localhost', 3000)
=> #<TCPSocket:fd 11>
irb(main):003:0> s = TCPSocket.open('localhost', 9999)
Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 9999
    from (irb):3:in `initialize'
  from (irb):3:in `open'
  from (irb):3
  from /Users/hoge/.rbenv/versions/2.3.3/bin/irb:11:in `<main>'
irb(main):004:0> s.close
=> nil