2010-02-16 9 views
10

यहां परिदृश्य है ... मेरे पास सबनेट्स की एक तालिका है। (नीचे देखें) मेरे पास एक आईपी पता है। मैं यह जानना चाहता हूं कि तालिका में लुकअप के आधार पर आईपी पता किस सबनेट से संबंधित है। तब इस संगठन का उपयोग यह निर्धारित करने के लिए किया जाएगा कि उपयोगकर्ता किस स्थान पर है। यह एक निजी नेटवर्क स्थान है इसलिए स्थान लुकअप के लिए मानक इंटरनेट लागू नहीं होगा। सबसे अच्छा तरीका क्या होगा? क्या मुझे आईपी एड्रेस को इसके न्यूमेरिक हिस्सों में तोड़ने और सभी सबनेट्स के खिलाफ थोड़ी सी तुलना करने की ज़रूरत है .. या जावा एपीआई में अंतर्निहित टूल्स हैं जो आईपी एड्रेस को सबनेट मास्क की तुलना करने के लिए अपना जीवन आसान बना सकते हैं?सबनेट मास्क की एक तालिका में एक आईपी पता मिलान ... जावा में सबसे अच्छा तरीका क्या है?

मैं मुख्य रूप से किसी दिए गए सबनेटमास्क में आईपैड्रेस की तुलना करने और इस मैचों को हां निर्धारित करने का सर्वोत्तम तरीका ढूंढ रहा हूं, या नहीं .. वैकल्पिक रूप से। सूची को स्टोर करने और न्यूनतम संचालन के साथ खोज करने के बारे में कोई सुझाव भी सराहना की जाएगी।

आदर्श रूप में मैं इस के समान कुछ कर रही होगी:

List subnetInfo = null; 

subnetInfo = findSubnet('192.168.0.1'); //value null if nothing found 

.... 

//return null if nothing found 
List findSubnet(String ipaddress) { 
    List subnetDetails = null; 
    .... code here ... 
    return subnetDetails; 
} 

तालिका 1: सबनेट

dk-ballerup-gen-off-v411  10.172.80.0/21 NANR-denmark-ballerup-metallbuen66-ground-first-floors-incl-dhcp-(sr14585203) 
ae-dubai-ofssl-gen-off-v410 10.172.88.0/24 NANR-arab-emirates-ofssl-iflex-general-office-v410-(sr12781477) 
ru-stpetersburg-gen-off-v411 10.172.89.0/24 NANR-russia-stpetersburg-general-office-incl-dhcp (bsteinba) 

उत्तर

3

Apache Commons Net इस प्रकार की चीज़ के लिए SubnetUtils है, जिसमें यह निर्धारित करना शामिल है कि दिया गया आईपी पता किसी दिए गए सबनेट के भीतर है या नहीं।

तुच्छ उदाहरण:

String[] subnetsMasks = { ... }; 
    Collection<SubnetInfo> subnets = new ArrayList<SubnetInfo>(); 
    for (String subnetMask : subnetsMasks) { 
     subnets.add(new SubnetUtils(subnetMask).getInfo()); 
    } 

    String ipAddress = ...; 
    for (SubnetInfo subnet : subnets) { 
     if (subnet.isInRange(ipAddress)) { 
      System.out.println("IP Address " + ipAddress + " is in range " + subnet.getCidrSignature()); 
     } 
    } 
+0

आपको किसी एपीआई की आवश्यकता क्यों है जिसके लिए आप ऑपरेटर के साथ जांच कर सकते हैं? ... यही कारण है कि netmasks * netmasks कहा जाता है ... – EJP

+3

क्योंकि एक सीआईडीआर मास्क को किसी संख्या में बदलना एक ऐसा काम है जिसे आप आसानी से गलत कर सकते हैं। जब आप इसे शेल्फ से निकाल सकते हैं, तो इसे फिर से कार्यान्वित क्यों करें? – skaffman

+0

आप मजाक कर रहे हैं, है ना? आपको बाइट्स को एक पूर्णांक में भी परिवर्तित नहीं करना है, आप बस लूप में बाइट्स को मास्क कर सकते हैं। कोड की लगभग 4 लाइनें। – EJP

3

याद रखें की नमूना सूची, कि आईपी पते का प्रतिनिधित्व ऐतिहासिक कारणों के लिए सिर्फ एक int मूल्य है दशमलव रूप में 4 ऑक्टेट्स के रूप में।

उसी टोकन के लिए, सबनेट वास्तव में नेटवर्क पते से प्रसारण पते पर लगातार ints की एक श्रृंखला है।

इसलिए यदि आपके आईपी एड्रेस ऑब्जेक्ट में एक इंट कनवर्टर है, तो आप आसानी से जांच सकते हैं कि सरल पूर्ण तुलना करके वह पूर्णांक सबनेट की सीमा में है या नहीं।

0

अपनी मेज एक एसक्यूएल तालिका है और अपने डेटाबेस PostgreSQL है, तो आप PostgreSQL types और functions उपयोग कर सकते हैं।

खैर कि स्थितियों की एक बहुत कुछ है ...

0

एक साथ आईपी पते और ints में नेटमास्क और और उन्हें चालू करें। यदि परिणाम आईपी पते के बराबर है तो यह उस नेटमास्क में एक पता है। ध्यान दें कि यदि आपके नेटमास्क अलग नहीं हैं तो आपको एक से अधिक मैच मिल सकते हैं।

+1

यह केवल आईपीवी 4 के लिए सच है। एक ही तकनीक आईपीवी 6 के लिए काम करती है, लेकिन पते इनट्स नहीं हैं। वे भी लंबे समय तक नहीं हैं। वे 128-बिट संख्याएं हैं, जो जावा बाइट सरणी के रूप में प्रतिनिधित्व करता है। –

0

मैं एक ही private networks करने के लिए आप से सवाल लेकिन सीमित (192.168.X.X, 10.x.x.x, ... & IPv6) का सामना करना पड़ रहा हूँ:

स्टीयर अपाचे कॉमन्स नेट SubnetUtils वर्ग की स्पष्ट है, यह गाड़ी है।

आप इस मामले तक ही सीमित रहे हैं भी आप InetAddress.isSiteLocalAddress()

0

मैं skaffman समाधान एक विधि के शीर्ष पर बनाया गया में बनाया का उपयोग करना चाहिए।जो लोग कॉपी पेस्ट समाधान में रुचि रखते हैं के लिए:

/** 
    * Checks if client ip equals or is in range of ip networks provided by 
    * semicolon separated list 
    * 
    * @param clientIp in numeric form like "192.168.0.10" 
    * @param ipList like "127.0.0.1;192.168.0.0/24;10.0.0.0/8" 
    * @return true if client ip from the list os ips and networks 
    */ 
    protected boolean evaluateIp(String clientIp, String ipList) { 
     BusinessLogger log = getLog(); 
     log.debug("Evaluate ip "); 
     if (ipList == null) { 
      log.info("No ip address provided in ApiPrivilege"); 
      return false; 
     } 
     String[] subnetMasks = ipList.split(";"); 
     for (String subnetMask : subnetMasks) { 
      subnetMask = subnetMask.trim(); 
      if (eq(subnetMask, clientIp)) 
       return true; 
      if (subnetMask.contains("/")) { 
       if (new SubnetUtils(subnetMask).getInfo().isInRange(clientIp)) 
        return true; 
      } 
     } 
     return false; 
    } 
-3

निम्नलिखित जार अपने pom.xml में

*<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-web</artifactId> 
    <version>3.0.7.RELEASE</version> 
</dependency>* 

स्प्रिंग ऊपर पुस्तकालय IPv4 और IPv6 का समर्थन करने के प्रदान करता है को शामिल करें।

नीचे दिए गए सबनेट के तहत आईपी गिरने के लिए कोड स्निपेट नीचे है।

System.out.println(matches("192.168.2.1", "192.168.2.1/11")); 
System.out.println( matches("192.168.2.1", "192.168.2.0/32")); 
System.out.println( matches("192.168.2.5", "192.168.2.0/24")); 
System.out.println( matches("fe80:0:0:0:0:0:c0a8:11", 
    "fe80:0:0:0:0:0:c0a8:1/120")); 
System.out.println( matches("fe80:0:0:0:0:0:c0a8:11", 
    "fe80:0:0:0:0:0:c0a8:1/128")); 
System.out.println(matches("2401:4900:1780:0:0:0:0:11", 
    "2401:4900:1780:0:0:0:0:0/44")); 


private static boolean matches(String ip, String subnet) { 
    IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(subnet); 
    return ipAddressMatcher.matches(ip); 
} 
+1

यदि आपके पास कोई नया प्रश्न है, तो कृपया [प्रश्न पूछें] (https://stackoverflow.com/questions/ask) बटन पर क्लिक करके इसे पूछें। इस प्रश्न का एक लिंक शामिल करें यदि यह संदर्भ प्रदान करने में मदद करता है। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/19032814) – shadow

+0

यह वास्तव में प्रश्न का उत्तर नहीं देता है। यदि आपके पास कोई अलग प्रश्न है, तो आप [प्रश्न पूछें] (https://stackoverflow.com/questions/ask) पर क्लिक करके पूछ सकते हैं। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/) हो जाने पर आप इस प्रश्न पर अधिक ध्यान आकर्षित करने के लिए [एक बक्षीस] (https://stackoverflow.com/help/privileges/set-bounties) भी जोड़ सकते हैं। क्या-प्रतिष्ठा)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/19032814) – Daniel

+0

गलत पोस्ट के लिए खेद है। अब मैंने जवाब सही करने के लिए संपादित किया है। –

संबंधित मुद्दे