一、判斷子網掩碼的有效性
子網掩碼滿足的條件:
- 是一個合法的IP地址
- 掩碼中的1是連續的
- 各類地址中掩碼的范圍(此文中不做判斷)
Java實現:
1 //掩碼是否是連續1判斷 2 private boolean IsSubnetMask(String netmask) { 3 String[] masks = netmask.split("\\."); 4 int mask = (Integer.parseInt(masks[0]) << 24) | (Integer.parseInt(masks[1]) << 16) | (Integer.parseInt(masks[2]) << 8) | Integer.parseInt(masks[3]); 5 mask = ~mask + 1; 6 if((mask & (mask - 1)) == 0) { 7 return true; 8 }else { 9 return false; 10 } 11 } 12 13 //是否是有效的IP地址 14 public boolean IsIpv4(String ipv4) { 15 if (ipv4 == null || ipv4.length() == 0) { 16 return false; 17 } 18 String[] parts = ipv4.split("\\."); 19 if (parts.length != 4) { 20 return false; 21 } 22 for (int i = 0; i < parts.length; ++i) { 23 try { 24 int n = Integer.parseInt(parts[i]); 25 if (n >= 0 && n <= 255) continue; 26 return false; 27 } 28 catch (NumberFormatException e) { 29 return false; 30 } 31 } 32 return true; 33 }
二、根據IP與子網掩碼獲取網絡號和廣播地址
網絡號:子網掩碼與IP相與,這里的實現方法是分成了四段,每段&后轉成10進制就是網絡號
廣播號:子網掩碼取反,然后將其與網絡號取|
注意:
- java中int占32位,如果我們的值沒有32位,高位就會用0來填充,如果取反,切記要去除高位(本文用了 XX&0xFF的方法)
- ">>"與 ”>>>“的區分
Java實現:
1 //根據IP與掩碼獲取網絡號(環回地址)和廣播地址 2 private Map<String, String> getNetwork(String address, String netmask) { 3 Map<String, String> map = new HashMap<String, String>(); 4 String network = new String(); 5 String broadcast = new String(); 6 String[] addresses = address.split("\\."); 7 String[] masks = netmask.split("\\."); 8 for(int i = 0; i < 4; i++) { 9 int opmasksegement = ~Integer.parseInt(masks[i]) & 0xFF; 10 //此處有坑,正常的int有32位,如果此數沒有32位的話,就會用0填充前面的數,從而導致取反0的部分會用1來填充,用上述方法可以獲取想要的部分 11 int netsegment = Integer.parseInt(addresses[i]) & Integer.parseInt(masks[i]); 12 network = network + String.valueOf(netsegment) + "."; 13 broadcast = broadcast + String.valueOf(opmasksegement | netsegment) + "."; 14 } 15 map.put("network", network.substring(0, network.length() - 1)); 16 map.put("broadcast", broadcast.substring(0, broadcast.length() - 1)); 17 return map; 18 }
三、判斷IP是否在某個網段中
將IP與掩碼相與,如果其與網絡號相同,則返回true
1 //判斷IP是否在某個網段內 2 private boolean isInRange(String ip, String netmask, String network) { 3 String[] ips = ip.split("\\."); 4 int ipAddr = (Integer.parseInt(ips[0]) << 24) | (Integer.parseInt(ips[1]) << 16) | (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]); 5 String[] masks = netmask.split("\\."); 6 int mask = (Integer.parseInt(masks[0]) << 24) | (Integer.parseInt(masks[1]) << 16) | (Integer.parseInt(masks[2]) << 8) | Integer.parseInt(masks[3]); 7 String[] networks =network.split("\\."); 8 int net = (Integer.parseInt(networks[0]) << 24) | (Integer.parseInt(networks[1]) << 16) | (Integer.parseInt(networks[2]) << 8) | Integer.parseInt(networks[3]); 9 return (ipAddr & mask) == net; 10 }