using System; using System.Collections.Generic; using System.Text; using System.Net;
namespace IPUtility { class Program { static void Main(string[] args) { IPRangeManage irm = new IPRangeManage(); irm.Add(new IPRange("石家庄", "219.148.24.0", "219.148.63.255")); irm.Add(new IPRange("石家庄", "222.222.0.0", "222.222.63.255")); irm.Add(new IPRange("唐山", "219.148.64.0", "219.148.79.255")); irm.Add(new IPRange("保定", "219.148.20.0", "219.148.23.255"));
Console.WriteLine(irm.Search("219.148.56.3").Name);
Console.ReadLine();
} }
public class IPRange { private string _Name = string.Empty;
private ulong _BeginIP = 0;
private ulong _EndIP = Int32.MaxValue;
/**//// <summary> /// IP段名称 /// </summary> public string Name { get { return _Name; } set { _Name = value; } }
/**//// <summary> /// ?始IP /// </summary> public ulong BeginIP { get { return _BeginIP; } set { _BeginIP = value; } }
/**//// <summary> /// ?束IP /// </summary> public ulong EndIP { get { return _EndIP; } set { _EndIP = value; } }
/**//// <summary> /// 此IP段的范? /// </summary> public ulong Range { get { return EndIP - BeginIP; } }
public IPRange(string name, string ipBegin, string ipEnd) { this.Name = name; this.BeginIP = IP2A(ipBegin); this.EndIP = IP2A(ipEnd); }
public static ulong IP2A(string ip) { byte[] bytes = IPAddress.Parse(ip).GetAddressBytes(); ulong ret = 0;
foreach (byte b in bytes) { ret <<= 8; ret |= b; }
return ret;
}
public static int Compare(IPRange x, IPRange y) { if(x.Range == y.Range) return 0; else if(x.Range > y.Range) return 1; else return -1; }
}
public class IPRangeManage { public IPRangeManage() { }
private List< IPRange> _IPRangeList = new List< IPRange>(); private bool _NeedSort = true;
public void Add(IPRange ipRange) { _IPRangeList.Add(ipRange); _NeedSort = true; }
private void Sort() { if (_NeedSort) { _IPRangeList.Sort(new Comparison<IPRange>(IPRange.Compare)); } }
public IPRange Search(string ipString) { ulong ip = IPRange.IP2A(ipString);
this.Sort();
foreach (IPRange ir in _IPRangeList) { if (ir.BeginIP <= ip && ir.EndIP >= ip) { return ir; } }
return null; } } } |