しょんぼり技術メモ

まいにちがしょんぼり

IPアドレスを扱う

IPアドレス・サブネット関係の処理が必要になったので調べた。
"IPAddr"クラスを使うようだ。そのメモ。

参照:プログラミング言語 Ruby リファレンスマニュアル

irb(main):001:0> require 'pp'
=> true
irb(main):002:0> require 'ipaddr'
=> true

irb(main):003:0> ipaddr1 = IPAddr.new("192.168.0.3")
=> #<IPAddr: IPv4:192.168.0.3/255.255.255.255>
irb(main):004:0> ipaddr2 = IPAddr.new("192.168.0.103")
=> #<IPAddr: IPv4:192.168.0.103/255.255.255.255>
# 素直に文字列としてIPアドレスを渡してやればOK


irb(main):005:0> ipaddr1 == ipaddr2
=> false
# 単純な比較


irb(main):006:0> masked = ipaddr1.mask("255.255.255.0")
=> #<IPAddr: IPv4:192.168.0.0/255.255.255.0>
# 既存のオブジェクトに、指定したネットマスクを適用したオブジェクトを取得


irb(main):007:0> masked.include?(ipaddr1)
=> true
irb(main):008:0> masked.include?(ipaddr2)
=> true
irb(main):009:0> ipaddr3 = IPAddr.new("192.168.1.3")
=> #<IPAddr: IPv4:192.168.1.3/255.255.255.255>
irb(main):010:0> masked.include?(ipaddr3)
=> false
# ネットマスク付きオブジェクトに含まれるかどうかをinclude?で取得


# ネットマスク付きオブジェクトを作るときは、↓こうじゃなくて
irb(main):011:0> range = IPAddr.new("172.16.0.5","255.255.0.0")
ArgumentError: address family unmatch
        from /usr/lib/ruby/1.8/ipaddr.rb:436:in `initialize'
        from (irb):11:in `new'
        from (irb):11

# ↓こうする。aaa.bbb.ccc.ddd/www.xxx.yyy.zzz 形式か、aaa.bbb.ccc.ddd/xx 形式を使う。
irb(main):012:0> range = IPAddr.new("172.16.0.5/255.255.0.0")
=> #<IPAddr: IPv4:172.16.0.0/255.255.0.0>

irb(main):013:0> ipaddr4 = IPAddr.new("172.16.100.200")
=> #<IPAddr: IPv4:172.16.100.200/255.255.255.255>
irb(main):014:0> range.include?(ipaddr4)
=> true
irb(main):015:0> range.include?(ipaddr1)
=> false