2011-12-19 7 views
8

सबनेट मास्क के अनुसार दो आईपी एक ही नेटवर्क में हैं या नहीं, तो मैं कैसे परीक्षण कर सकता हूं?जावा के साथ टेस्ट यदि दो आईपी एक ही नेटवर्क में हैं

उदाहरण के लिए मेरे पास आईपी 1.2.3.4 और 1.2.4.3 हैं: मास्क 255.0.0.0 या 255.255.0.0 या यहां तक ​​कि 255.255.248.0 है, लेकिन मास्क 255.255.255.0 नहीं है, तो दोनों एक ही नेटवर्क में हैं।

उत्तर

5

सरल पर्याप्त: mask & ip1 == mask & ip2 - आपको आईपी को सभी के लिए एक संख्या के रूप में समझना होगा, लेकिन यह स्पष्ट होना चाहिए।

+0

लेकिन मुखौटा कैसे प्राप्त करें? और यह आईपीवी 6 के लिए भी काम करता है? – xZise

+0

@xZise मास्क आपका सबनेट मास्क है। और यकीन है कि यह आईपीवी 6 के लिए ठीक काम करेगा - आईपीवी 4 की तुलना में बस एक अलग संकेत। लेकिन अंत में आप आईपी के नेटवर्क हिस्से को मुखौटा करने के लिए बस सबनेट मास्क का उपयोग करें और फिर एक-दूसरे के साथ तुलना करें। – Voo

+0

लेकिन प्रोग्राम से सबनेट मास्क कैसे प्राप्त करें? – xZise

14

इस विधि का प्रयास करें:

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; 

} 

और इस तरह इसका इस्तेमाल:

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

संपादित करें:

आप पहले से ही आईपी के रूप में InetAddress वस्तुओं है:

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

अच्छा समाधान - स्वयं स्ट्रिंग को पार्स करने से बचाता है। – Voo

+0

मेरे पास आईपी स्वयं ही इनेट एड्रेस्रेस के रूप में हैं, इसलिए अधिकांश में मुझे मुखौटा पार्स करना होगा। – xZise

+0

@xZise मैंने अपनी आखिरी टिप्पणी से मेल खाने के लिए अपना जवाब संपादित किया। ध्यान दें कि यदि मास्क सभी तुलनाओं के लिए समान है, तो यह केवल एक बार अपने बाइट [] पते की गणना करना बेहतर होगा और इसे पुन: उपयोग करें –

0

यह समाधान आईपीवी 4/आईपीवी 6 के साथ भी काम करेगा।

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); 
} 
संबंधित मुद्दे