इस उत्तर के अंत में आपको आईपीवी 4 पते का प्रतिनिधित्व करने के लिए संरचना का पूर्ण कार्यान्वयन मिलेगा।
यहाँ वास्तव में उपयोग के सरल उदाहरण है: -
List<IPV4Address> list = new List<IPV4Address>();
list.Add(IPV4Address.FromString("3.4.0.0", 24));
var x = IPV4Address.FromString("3.4.0.6");
foreach (var addr in list.Where(a => a.Contains(x)))
Console.WriteLine(addr);
मूल्य "3.4.0.0/255.255.255.0" 3.4.0.6 के बाद से सांत्वना inthe प्रदर्शित किया जाता है 3.4.0.0/24 सबनेट में पाया जाता है। मान लिया जाये कि list
विभिन्न सबनेट से भरा हुआ है और x
तो यह किसी भी पता हो सकता है: -
var result = list.Where(a => a.Contains(x))
.OrderByDescending(a => a.Mask)
.FirstOrDefault();
सबसे विशिष्ट सबनेट का चयन करेंगे के लिए कि x
शामिल हैं।
public struct IPV4Address
{
private UInt32 _Value;
private UInt32 _Mask;
public UInt32 Value
{
get { return _Value; }
private set { _Value = value; }
}
public UInt32 Mask
{
get { return _Mask; }
private set { _Mask = value; }
}
public static IPV4Address FromString(string address)
{
return FromString(address, 32);
}
public static IPV4Address FromString(string address, int maskLength)
{
string[] parts = address.Split('.');
UInt32 value = ((UInt32.Parse(parts[0]) << 24) +
((UInt32.Parse(parts[1])) << 16) +
((UInt32.Parse(parts[2])) << 8) +
UInt32.Parse(parts[3]));
return new IPV4Address(value, maskLength);
}
public IPV4Address(UInt32 value)
{
_Value = value;
_Mask = int.MaxValue;
}
public IPV4Address(UInt32 value, int maskLength)
{
if (maskLength < 0 || maskLength > 32)
throw new ArgumentOutOfRangeException("maskLength", "Must be 0 to 32");
_Value = value;
if (maskLength == 32)
_Mask = UInt32.MaxValue;
else
_Mask = ~(UInt32)((1 << (32 - maskLength))-1);
if ((_Value & _Mask) != _Value)
throw new ArgumentException("Address value must be contained in mask");
}
public bool Contains(IPV4Address address)
{
if ((Mask & address.Mask) == Mask)
{
return (address.Value & Mask) == Value;
}
return false;
}
public override string ToString()
{
string result = String.Format("{0}.{1}.{2}.{3}", (_Value >> 24),
(_Value >> 16) & 0xFF,
(_Value >> 8) & 0xFF,
_Value & 0xFF);
if (_Mask != UInt32.MaxValue)
result += "/" + String.Format("{0}.{1}.{2}.{3}", (_Mask >> 24),
(_Mask >> 16) & 0xFF,
(_Mask >> 8) & 0xFF,
_Mask & 0xFF);
return result;
}
}
+1, लेकिन ipawpl के निर्माता को 32 की उपसर्ग लंबाई का उपयोग नहीं करना चाहिए? आदर्श रूप से, IPAddressWithPrefixLength (IPAddress.Parse ("3.4.5.6"), 32) के साथ निर्मित एक उदाहरण भी पाया जाना चाहिए, है ना? –
@ विनी: मुझे ऐसा नहीं लगता है, क्योंकि 3.4.5.6 में उपसर्ग की लंबाई अभी भी 16 बिट्स है, नहीं? (या 24?) – dtb
@ डीटीबी: मेरा मतलब था, नेटवर्क पता (16-बिट उपसर्ग के साथ) सबनेट में एक मनमाना पते से मेल खाना चाहिए (जो एक पूर्ण 32-बिट पता हो सकता है, या 24-बिट कह सकता है मूल 3.4.0.0 नेटवर्क का सबनेट)। –