2012-05-09 10 views
7

यदि मेरे पास आईपी एड्रेस रेंज (सीआईडीआर नोटेशन) है और मुझे यह जानने की ज़रूरत है कि कुछ मनमानी आईपी पता उस सीमा के भीतर है - दोनों स्ट्रिंग के रूप में प्रस्तुत किए गए हैं - सी # के साथ ऐसा करने का सबसे आसान तरीका क्या है?सी # में आईपी एड्रेस रेंज की तुलना कैसे करें?

उदाहरण:

  • आईपीवी 4 रेंज: 192.168.168.100/24, आईपी जाँच करने के लिए: 192.168.168.200
  • आईपीवी 6 रेंज: fe80::202:b3ff:fe1e:8329/24, आईपी जाँच करने के लिए: 2001:db8::
+0

क्या आप आईपीवी 4 केवल समाधान देखने में रुचि रखते हैं? – Tung

+0

नहीं आईपीवी 4 बहुत आसान है। आईपीवी 6, या जब दो प्रारूप मिश्रित होते हैं तो यह चुनौतीपूर्ण बनाता है। यहां प्रतिक्रियाओं की कमी के आधार पर, ऐसा लगता है कि बहुत से लोग इसके बारे में परवाह नहीं करते हैं ... – ahmd0

उत्तर

10

यहाँ एक सरल वर्ग है:

public class IPSubnet 
{ 
    private readonly byte[] _address; 
    private readonly int _prefixLength; 

    public IPSubnet(string value) 
    { 
     if (value == null) 
      throw new ArgumentNullException("value"); 

     string[] parts = value.Split('/'); 
     if (parts.Length != 2) 
      throw new ArgumentException("Invalid CIDR notation.", "value"); 

     _address = IPAddress.Parse(parts[0]).GetAddressBytes(); 
     _prefixLength = Convert.ToInt32(parts[1], 10); 
    } 

    public bool Contains(string address) 
    { 
     return this.Contains(IPAddress.Parse(address).GetAddressBytes()); 
    } 

    public bool Contains(byte[] address) 
    { 
     if (address == null) 
      throw new ArgumentNullException("address"); 

     if (address.Length != _address.Length) 
      return false; // IPv4/IPv6 mismatch 

     int index = 0; 
     int bits = _prefixLength; 

     for (; bits >= 8; bits -= 8) 
     { 
      if (address[index] != _address[index]) 
       return false; 
      ++index; 
     } 

     if (bits > 0) 
     { 
      int mask = (byte)~(255 >> bits); 
      if ((address[index] & mask) != (_address[index] & mask)) 
       return false; 
     } 

     return true; 
    } 
} 

नमूना उपयोग:

Console.WriteLine(new IPSubnet("192.168.168.100/24").Contains("192.168.168.200")); // True 
Console.WriteLine(new IPSubnet("fe80::202:b3ff:fe1e:8329/24").Contains("2001:db8::")); // False 

इस वर्ग के व्यवहार करता है सभी आईपीवी 4 सभी IPv6 पतों से अलग पते, अनुवाद करने के लिए कोई प्रयास नहीं कर रही है आईपीवी 4 और आईपीवी 6 के बीच।

+0

धन्यवाद। हालांकि आईपीवी 4 को आईपीवी 6 में परिवर्तित किया जाना चाहिए, उदाहरण के लिए, कोई ":: 192.168.168.100" का उपयोग कर सकता है जिसे आपके कोड द्वारा आईपीवी 6 के रूप में माना जाएगा। – ahmd0

+1

क्या आप वाकई आईपीवी 4 एड्रेस को आईपीवी 6 में कनवर्ट करना सही है, इसे बस "::" से उपसर्ग कर रहे हैं? [आईपीवी 6 पता] (http://en.wikipedia.org/wiki/IPv6_address#Special_addresses) विकिपीडिया लेख इसे आईपीवी 4 अनुवाद तंत्र में से एक के रूप में सूचीबद्ध नहीं करता है। –

+0

इस देरी के लिए खेद है। मैंने इसे ऑनलाइन पाया, यदि आप "आईपीवी 4 को आईपीवी 6 में कनवर्ट करें" खोजते हैं। तो मुझे नहीं पता ... – ahmd0

2

मैं के लिए कोड लिखने के लिए नहीं जा रहा हूँ आप लेकिन

आप आरंभ करने के लिए पर्याप्त होना चाहिए।

गुड लक

+1

अच्छा, बहुत बुरा, क्योंकि यह तुलना नहीं है कि यह तुलना कैसे करें। उदाहरण के लिए, क्या होगा यदि श्रेणी ipv6 नोटेशन में है लेकिन पता ipv4 और उपाध्यक्ष है? आईपीवी 6 पते पर सबनेट मास्क को भी लागू करना या तो स्पष्ट नहीं है। और वेब पर इसके कई उदाहरण नहीं हैं ... – ahmd0

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है? आईपीवी 4 और आईपीवी 6 2 पूरी तरह से अलग चीजें हैं। आईपीवी 4 आईपीवी 6 नोटेशन में नहीं होगा। मैं इलाज नहीं करता :: 1 9 2.168.1।1 अन्य आईपीवी 6 पते के समान ही। – LukeP

1

मैं आईपीनेटवर्क लाइब्रेरी https://github.com/lduchosal/ipnetwork के उपयोग की अनुशंसा करता हूं। संस्करण 2 के रूप में, यह आईपीवी 4 और आईपीवी 6 का भी समर्थन करता है।

आईपीवी 6

IPNetwork ipnetwork = IPNetwork.Parse("fe80::202:b3ff:fe1e:8329/24"); 

    IPAddress ipaddress = IPAddress.Parse("2001:db8::"); 
    IPAddress ipaddress2 = IPAddress.Parse("fe80::202:b3ff:fe1e:1"); 

    bool contains1 = IPNetwork.Contains(ipnetwork, ipaddress); 
    bool contains2 = IPNetwork.Contains(ipnetwork, ipaddress2); 

    Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress,  contains1); 
    Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress2,  contains2); 

आउटपुट

fe80::/24 contains 2001:db8:: : False 
    fe80::/24 contains fe80::202:b3ff:fe1e:1 : True 

आईपीवी 4

IPNetwork ipnetwork = IPNetwork.Parse("192.168.168.100/24"); 

    IPAddress ipaddress = IPAddress.Parse("192.168.168.200"); 
    IPAddress ipaddress2 = IPAddress.Parse("192.168.0.200"); 

    bool contains1 = IPNetwork.Contains(ipnetwork, ipaddress); 
    bool contains2 = IPNetwork.Contains(ipnetwork, ipaddress2); 

    Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress, contains1); 
    Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress2, contains2); 

आउटपुट

192.168.168.0/24 contains 192.168.168.200 : True 
    192.168.168.0/24 contains 192.168.0.200 : False 

मज़े करो!

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