2012/11/30
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 はそれほど詳しくないのでコーディングが冗長だけど、 取りあえず動作している(気がする)。