Project

General

Profile

Feature #8047

Updated by shyouhei (Shyouhei Urabe) over 6 years ago

現状のIPAddrはネットマスク付きの場合、 

 ``` 
 IPAddr.new("192.168.1.99/24") 
  => #<IPAddr: IPv4:192.168.1.0/255.255.255.0>  
 ``` 

  

 のようにネットワークアドレスとして生成されますが、 
 マスク付きの場合にマスクされないホストとして生成する 
 モードを提案します 
 (=ホストのIPアドレスとどのネットワークかを把握したい) 
 ex. 

 ``` 
 IPAddr.new("192.168.1.99/24") 
  => #<IPAddr: IPv4:192.168.1.99/255.255.255.0>  
 ``` 

  


 newの第二引数にfamilyが指定されていれば32bitマスクのホストアドレスなので、 
 引数がAF_INET/INET6または:Hostならばホストとして生成させます 

 - IPAddr.new(int, family) 
 ``` 
 IPAddr.new(3232235875, Socket::AF_INET) 
  => #<IPAddr: IPv4:192.168.1.99/255.255.255.255> 
 ``` 

 - IPAddr.new(ip, :Host) 
 ``` 
 IPAddr.new("192.168.1.99/24", :Host) 
  => #<IPAddr: IPv4:192.168.1.99/255.255.255.0>  
 ``` 

  

 引数の構成とシンボル名がイマイチですが既存との両立ということで 
 以下がパッチになります 


 ``` 
 --- ipaddr.rb.orig        2013-03-08 13:59:07.000000000 +0900 
 +++ ipaddr.rb     2013-03-08 14:35:06.000000000 +0900 
 @@ -440,7 +440,7 @@ 
      else 
        raise AddressFamilyError, "unsupported address family" 
      end 
 -      @addr = ((@addr >> masklen) << masklen) 
 +      @addr = ((@addr >> masklen) << masklen) if @host_mode == false 
      return self 
    end 
 
 @@ -477,6 +477,14 @@ 
          raise AddressFamilyError, "unsupported address family: #{family}" 
        end 
      end 
 + 
 +      if family == :Host  
 +        @host_mode = true 
 +        family = Socket::AF_UNSPEC 
 +      else 
 +        @host_mode = false 
 +      end 
 + 
      prefix, prefixlen = addr.split('/') 
      if prefix =~ /^\[(.*)\]$/i 
        prefix = $1 
 ```

Back