2012-03-15 46 views
9

Làm cách nào để kiểm tra xem địa chỉ IP có nằm trong danh mục riêng tư không?Kiểm tra xem ipAddress có nằm trong phạm vi riêng tư

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

Mọi đề xuất sẽ được đánh giá cao.

CẬP NHẬT ĐÁP

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(); 
    } 

tôi đã viết phương pháp này và nó làm việc tốt cho tôi. Nhưng có trường hợp nào trong đó phương pháp này sẽ không hoạt động? Tôi chỉ muốn chắc chắn rằng nó sẽ làm việc cho mọi trường hợp.

+0

Duplicate của http://stackoverflow.com/question/8141277/check-if-ipv4-address-is-in-private-range – sw1nn

Trả lời

2

Đây là một bản hack nhanh mà tôi đã tạo để kiểm tra địa chỉ của chính mình.

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()); 
     } 
    } 

} 

EDIT: Mã này chưa được kiểm tra cho địa chỉ liên kết địa phương, máy chủ cục bộ hoặc khối địa chỉ dành riêng cho tài liệu. Hai trường hợp đầu tiên có các phương thức trả về chúng. Tài liệu cuối cùng không được tham chiếu trong tài liệu của lớp.

+0

Nếu tôi cần kiểm tra một số ipAddress ngẫu nhiên thì tôi có thể làm như thế nào? Giả sử nếu ipAddress là 172.18.36.81 – AKIWEB

+0

Thay thế 'getLocalHost()' bằng 'getByName (" 172.18.36.81 ")'. Đọc JavaDoc cho InetAddress. – BillThor

13

Chỉnh sửa: Phương pháp chính xác là InetAddress.isSiteLocalAddress().

Thường trình tiện ích để kiểm tra xem InetAddress có phải là địa chỉ cục bộ của trang web hay không.

Trả về: boolean cho biết liệu InetAddress có phải là địa chỉ trang web địa chỉ cục bộ hay không; hoặc sai nếu địa chỉ không phải là địa chỉ unicast cục bộ của trang web.

Xem nhận xét để thảo luận.

+0

Bạn có thể cho tôi một ví dụ dựa trên điều này không. Rất cảm kích. Cảm ơn – AKIWEB

+0

ví dụ trong liên kết tôi đưa vào nhận xét câu hỏi ... – sw1nn

+1

đó là '' InetAddress.isSiteLocalAddress() '' thay vì '' isLinkLocalAddress() ''. Xem http: // 4sysops.com/archives/ipv6-tutorial-part-6-site-local-address-và-link-local-address/để thảo luận – sw1nn

2

Trước hết, các mạng tư nhân có thể sử dụng địa chỉ IPv4 bất cứ nơi nào trong phạm vi sau đây:

  • a) 192.168.0.0 - địa chỉ 192.168.255.255 (65.536 IP)
  • b) 172.16.0.0 - 172,31 .255.255 (1.048.576 địa chỉ IP)
  • c) 10.0.0.0 - 10.255.255.255 (địa chỉ IP 16.777.216)

Như chúng ta có thể nhìn thấy từ phương pháp isSiteLocalAddress trong 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)); 
} 

Vì vậy, trường hợp b) 172.16.0.0 - 172.31.255.255 (1.048.576 địa chỉ IP) không được thỏa mãn. Nhưng bạn có thể dễ dàng viết bạn sở hữu phiên bản của làm thế nào để biết được một địa chỉ là tin address.Here là phiên bản của tôi:

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

Câu trả lời này không đúng. Trường hợp b) được thỏa mãn vì mặt nạ là '0xF0'. Nó là tầm thường để kiểm tra rằng 'InetAddress.getByName (" 172.31.255.255 "). IsSiteLocalAddress()' trả về true. –

+1

@AlejandroCDeBaca là chính xác. –

0

tôi sử dụng này:

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; 
    } 
Các vấn đề liên quan