Nov 30, 2012

IPv4 アドレスがネットワークに属しているか調べる

ネットマスクとはその名の通り IPv4 アドレスのうち、 どこまでのビットがネットワークアドレスなのかを示しているので、 IPv4 アドレスとネットマスクの論理和はネットワークアドレスとなる。
そのため、取得した論理和とネットワークアドレスが等しい場合は IPv4 アドレスはネットワークに属す事になる。

C で実装する場合はこんな感じかな。

  1int     checkAddr(const char *network, const char *netmask, const char *ipaddr)
  2{
  3
  4    struct  in_addr net,
  5                    mask,
  6                    addr;
  7
  8    if(inet_aton(network, &net) &&
  9            inet_aton(netmask, &mask) &&
 10            inet_aton(ipaddr", &addr))
 11        return((addr.s_addr & mask.s_addr) == (net.s_addr & mask.s_addr));
 12    else
 13        return(0);
 14
 15}
    

ちなみに仕事で実装した java のコード。
  1boolean checkAddr(String network, String netmask, String ipaddr)
  2{
  3
  4    try {
  5        int     n = 0,
  6                m = 0,
  7                a = 0;
  8        byte[]  net = InetAddress.getByName(network).getAddress(),
  9                mask = InetAddress.getByName(netmask).getAddress(),
 10                addr = InetAddress.getByName(ipaddr).getAddress();
 11
 12        for(int i=0; i<4; i++)
 13            n |= ((int)net[i] & 0xff) << (8 * (3 - i));
 14        for(int i=0; i<4; i++)
 15            m |= ((int)mask[i] & 0xff) << (8 * (3 - i));
 16        for(int i=0; i<4; i++)
 17            a |= ((int)addr[i] & 0xff) << (8 * (3 - i));
 18
 19        return((a & m) == (n & m));
 20
 21    } catch (Throwable e){
 22        return false;
 23    }
 24
 25}
    
java はそれほど詳しくないのでコーディングが冗長だけど、 取りあえず動作している(気がする)。

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.