2012-03-15 132 views
9

如何檢查IP地址是否屬於私人類別?檢查ipAddress是否在私人範圍

if(isPrivateIPAddress(ipAddress)) { 
    //do something 
} 

任何建議,將不勝感激。

修訂ANSWER

private static boolean isPrivateIPAddress(String ipAddress) { 

     InetAddress ia = null; 

     try { 
      InetAddress ad = InetAddress.getByName(ipAddress); 
      byte[] ip = ad.getAddress(); 
      ia = InetAddress.getByAddress(ip); 
     } catch (UnknownHostException e) { 

      e.printStackTrace(); 
     } 

     return ia.isSiteLocalAddress(); 
    } 

我寫了這個方法,它的工作對我罰款。但是有沒有這種方法不適用?我只是想確保它適用於每一種情況。

+0

重複http://stackoverflow.com的/ questions/8141277/check-if-ipv4-address-is-private-range – sw1nn 2012-03-15 22:55:53

回答

2

這是我生成的一個快速入侵以測試我自己的地址。

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class LocalAddress { 

    public static void main(String[] args) { 
     InetAddress address = null; 
     try { 
      address = InetAddress.getLocalHost(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     if (address.isSiteLocalAddress()) { 
      System.out.println("Site Local Address: " + address.getHostAddress()); 
     } else { 
      System.out.println("Routeable Address: " + address.getHostAddress()); 
     } 
    } 

} 

編輯:此代碼尚未經過測試鏈接本地地址,本地主機或地址塊爲文檔保留。前兩種情況下有返回它們的方法。最後一個沒有在類的文檔中引用。

+0

如果我需要檢查一些隨機ipAddress然後我該怎麼做呢?假設ipAddress是172.18.36.81 – AKIWEB 2012-03-15 23:42:15

+0

用'getByName(「172.18.36.81」)'替換'getLocalHost()'。閱讀JavaDoc的InetAddress。 – BillThor 2012-03-16 00:02:12

13

編輯:正確的方法是InetAddress.isSiteLocalAddress()

檢查InetAddress是否爲站點本地地址的實用程序。

返回:指示InetAddress是否爲本地站點的布爾值 address;如果地址不是本地本地單播地址,則爲false。

查看評論的討論。

+0

你能舉出一個基於此的例子嗎?非常感謝。謝謝 – AKIWEB 2012-03-15 22:56:29

+0

鏈接中的例子我把問題置評... – sw1nn 2012-03-15 22:57:05

+1

它是''InetAddress.isSiteLocalAddress()''而不是''isLinkLocalAddress()''。請參閱http:// 4sysops。com/archives/ipv6-tutorial-part-6-site-local-addresses-and-link-local-addresses /討論 – sw1nn 2012-03-15 23:01:29

2

首先,專用網絡可以使用IPv4地址的任何地方在以下範圍內:

  • 一)192.168.0.0 - 192.168.255.255(65,536 IP地址)
  • 二)172.16.0.0 - 172.31 .255.255(1,048,576 IP地址)
  • C)10.0.0.0 - 10.255.255.255(16777216 IP地址)

正如我們從法isSiteLocalAddress在Inet4Address.java看到:

public boolean isSiteLocalAddress() { 
    // refer to RFC 1918 
    // 10/8 prefix 
    // 172.16/12 prefix 
    // 192.168/16 prefix 
    int address = holder().getAddress(); 
    return (((address >>> 24) & 0xFF) == 10) 
     || ((((address >>> 24) & 0xFF) == 172) 
      && (((address >>> 16) & 0xF0) == 16)) 
     || ((((address >>> 24) & 0xFF) == 192) 
      && (((address >>> 16) & 0xFF) == 168)); 
} 

因此情況b)172.16.0.0 - 172.31.255.255(1,048,576個IP地址)未被滿足。但是你可以很容易地編寫你自己的如何讓地址是否爲版本私人address.Here是我的版本:

import com.google.common.net.InetAddresses; 

private static boolean isPrivateV4Address(String ip) { 
    int address = InetAddresses.coerceToInteger(InetAddresses.forString(ip)); 
    return (((address >>> 24) & 0xFF) == 10) 
      || ((((address >>> 24) & 0xFF) == 172) 
       && ((address >>> 16) & 0xFF) >= 16 
       && ((address >>> 16) & 0xFF) <= 31) 
      || ((((address >>> 24) & 0xFF) == 192) 
       && (((address >>> 16) & 0xFF) == 168)); 
} 
+1

這個答案不正確。情況b)得到滿足,因爲掩碼是'0xF0'。測試'InetAddress.getByName(「172.31.255.255」)。isSiteLocalAddress()'返回true是微不足道的。 – 2017-04-27 18:30:42

+1

@AjjandroCDeBaca是正確的。 – 2017-06-23 07:11:59

0

我用這個:

public boolean isPrivateIP(String ipAddress) { 
     boolean isValid = false; 

     if (ipAddress != null && !ipAddress.isEmpty()) { 
      String[] ip = ipAddress.split("\\."); 
      short[] ipNumber = new short[] { 
        Short.parseShort(ip[0]), 
        Short.parseShort(ip[1]), 
        Short.parseShort(ip[2]), 
        Short.parseShort(ip[3]) 
       }; 

      if (ipNumber[0] == 10) { // Class A 
       isValid = true; 
      } else if (ipNumber[0] == 172 && (ipNumber[1] >= 16 && ipNumber[1] <= 31)) { // Class B 
       isValid = true; 
      } else if (ipNumber[0] == 192 && ipNumber[1] == 168) { // Class C 
       isValid = true; 
      } 
     } 

     return isValid; 
    }