2011-12-19 31 views
8

Làm cách nào để kiểm tra xem hai IP có trong cùng một mạng theo mặt nạ mạng con không?Kiểm tra bằng Java nếu hai IP nằm trong cùng một mạng

Ví dụ tôi có IP 1.2.3.4 và 1.2.4.3: Cả hai đều nằm trong cùng một mạng nếu mặt nạ là 255.0.0.0 hoặc 255.255.0.0 hoặc thậm chí 255.255.248.0 nhưng không phải nếu mặt nạ là 255.255.255.0.

Trả lời

5

Đơn giản đủ: mask & ip1 == mask & ip2 - bạn phải giải thích các IP tất cả dưới dạng một số duy nhất cho điều đó nhưng điều đó phải rõ ràng.

+0

Nhưng cách lấy mặt nạ? Và điều này cũng làm việc cho IPv6? – xZise

+0

@xZise Mặt nạ là mặt nạ mạng con của bạn. Và chắc chắn nó sẽ làm việc cho IPv6 cũng tốt - chỉ là một ký hiệu khác khi so sánh với IPv4. Nhưng cuối cùng bạn chỉ cần sử dụng mặt nạ mạng con để che giấu phần mạng của IP và sau đó so sánh chúng với nhau. – Voo

+0

Nhưng làm cách nào để lấy mặt nạ mạng con từ chính chương trình? – xZise

14

Hãy thử phương pháp này:

public static boolean sameNetwork(String ip1, String ip2, String mask) 
throws Exception { 

    byte[] a1 = InetAddress.getByName(ip1).getAddress(); 
    byte[] a2 = InetAddress.getByName(ip2).getAddress(); 
    byte[] m = InetAddress.getByName(mask).getAddress(); 

    for (int i = 0; i < a1.length; i++) 
     if ((a1[i] & m[i]) != (a2[i] & m[i])) 
      return false; 

    return true; 

} 

Và sử dụng nó như thế này:

sameNetwork("1.2.3.4", "1.2.4.3", "255.255.255.0") 
> false 

EDIT:

Nếu bạn đã có IP như InetAddress đối tượng:

public static boolean sameNetwork(InetAddress ip1, InetAddress ip2, String mask) 
throws Exception { 

    byte[] a1 = ip1.getAddress(); 
    byte[] a2 = ip2.getAddress(); 
    byte[] m = InetAddress.getByName(mask).getAddress(); 

    for (int i = 0; i < a1.length; i++) 
     if ((a1[i] & m[i]) != (a2[i] & m[i])) 
      return false; 

    return true; 

} 
+0

Giải pháp tốt - tránh phải tự phân tích chuỗi. – Voo

+0

Tôi có các IP chính nó là InetAddresses, vì vậy nhiều nhất tôi phải phân tích mặt nạ. – xZise

+0

@xZise Tôi đã chỉnh sửa câu trả lời của mình để khớp với nhận xét cuối cùng của bạn. Lưu ý rằng nếu mặt nạ giống nhau đối với tất cả các so sánh, thì tốt hơn nên chỉ tính toán địa chỉ byte [] của nó một lần và sử dụng lại nó –

0

giải pháp này cũng sẽ hoạt động với IPv4/IPv6.

static boolean sameNetwork(final byte[] x, final byte[] y, final int mask) { 
    if(x == y) return true; 
    if(x == null || y == null) return false; 
    if(x.length != y.length) return false; 
    final int bits = mask & 7; 
    final int bytes = mask >>> 3; 
    for(int i=0;i<bytes;i++) if(x[i] != y[i]) return false; 
    final int shift = 8 - bits; 
    if(bits != 0 && x[bytes]>>>shift != y[bytes]>>>shift) return false; 
    return true; 
} 
static boolean sameNetwork(final InetAddress a, final InetAddress b, final int mask) { 
    return sameNetwork(a.getAddress(), b.getAddress(), mask); 
} 
Các vấn đề liên quan