您的位置:首页 > 数据库

C#读取纯真IP数据库

2007-12-28 15:37 369 查看
[align=left]using System;[/align]
[align=left]using System.Collections.Generic;[/align]
[align=left]using System.Text;[/align]
[align=left]using System.IO;[/align]
[align=left]namespace 纯真IP数据库研究[/align]
[align=left]{[/align]
[align=left] ///<summary>[/align]
[align=left] /// 提供从纯真IP数据库搜索IP信息的方法;[/align]
[align=left] /// 感谢LumaQQ提供纯真IP数据库格式文档;[/align]
[align=left] /// ----HeDaode 2007-12-28 四川教育学院[/align]
[align=left] ///</summary>[/align]
[align=left] public class IPSearch[/align]
[align=left] {[/align]
[align=left] FileStream ipFile;[/align]
[align=left] long ip;[/align]
[align=left] string ipfilePath;[/align]
[align=left] [/align]
[align=left] ///<summary>[/align]
[align=left] /// 构造函数[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="ipfilePath">纯真IP数据库路径</param>[/align]
[align=left] public IPSearch(string ipfilePath)[/align]
[align=left] {[/align]
[align=left] this.ipfilePath = ipfilePath;[/align]
[align=left] }[/align]
[align=left] //测试[/align]
[align=left] static void Main(string[] args)[/align]
[align=left] {[/align]
[align=left] string ipfilePath = @"C:/Documents and Settings/Daode/桌面/qqwry/QQWry.dat";[/align]
[align=left] IPSearch ipSearch = new IPSearch(ipfilePath);[/align]
[align=left] string ip = "72.51.27.51";[/align]
[align=left] IPSearch.IPLocation loc = ipSearch.GetIPLocation(ip);[/align]
[align=left] Console.WriteLine("你查的ip是:{0} 地理位置:{1} {2}", ip, loc.country, loc.area);[/align]
[align=left] Console.ReadKey();[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 地理位置,包括国家和地区[/align]
[align=left] ///</summary>[/align]
[align=left] public struct IPLocation[/align]
[align=left] {[/align]
[align=left] public string country, area;[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 获取指定IP所在地理位置[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="strIP">要查询的IP地址</param>[/align]
[align=left] ///<returns></returns>[/align]
[align=left] public IPLocation GetIPLocation(string strIP)[/align]
[align=left] {[/align]
[align=left] ip = IPToLong(strIP);[/align]
[align=left] ipFile = new FileStream(ipfilePath, FileMode.Open, FileAccess.Read);[/align]
[align=left] long[] ipArray = BlockToArray(ReadIPBlock());[/align]
[align=left] long offset = SearchIP(ipArray, 0, ipArray.Length - 1) * 7 + 4;[/align]
[align=left] ipFile.Position += offset;//跳过起始IP[/align]
[align=left] ipFile.Position = ReadLongX(3) + 4;//跳过结束IP[/align]
[align=left] [/align]
[align=left] IPLocation loc = new IPLocation();[/align]
[align=left] int flag = ipFile.ReadByte();//读取标志[/align]
[align=left] if (flag == 1)//表示国家和地区被转向[/align]
[align=left] {[/align]
[align=left] ipFile.Position = ReadLongX(3);[/align]
[align=left] flag = ipFile.ReadByte();//再读标志[/align]
[align=left] }[/align]
[align=left] long countryOffset = ipFile.Position;[/align]
[align=left] loc.country = ReadString(flag);[/align]
[align=left] [/align]
[align=left] if (flag == 2)[/align]
[align=left] {[/align]
[align=left] ipFile.Position = countryOffset + 3;[/align]
[align=left] }[/align]
[align=left] flag = ipFile.ReadByte();[/align]
[align=left] loc.area = ReadString(flag);[/align]
[align=left] [/align]
[align=left] ipFile.Close();[/align]
[align=left] ipFile = null;[/align]
[align=left] return loc;[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 将字符串形式的IP转换位long[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="strIP"></param>[/align]
[align=left] ///<returns></returns>[/align]
[align=left] public long IPToLong(string strIP)[/align]
[align=left] {[/align]
[align=left] byte[] ip_bytes = new byte[8];[/align]
[align=left] string[] strArr = strIP.Split(new char[] { '.' });[/align]
[align=left] for (int i = 0; i < 4; i++)[/align]
[align=left] {[/align]
[align=left] ip_bytes[i] = byte.Parse(strArr[3 - i]);[/align]
[align=left] }[/align]
[align=left] return BitConverter.ToInt64(ip_bytes, 0);[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 将索引区字节块中的起始IP转换成Long数组[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="ipBlock"></param>[/align]
[align=left] long[] BlockToArray(byte[] ipBlock)[/align]
[align=left] {[/align]
[align=left] long[] ipArray = new long[ipBlock.Length / 7];[/align]
[align=left] int ipIndex = 0;[/align]
[align=left] byte[] temp = new byte[8];[/align]
[align=left] for (int i = 0; i < ipBlock.Length; i += 7)[/align]
[align=left] {[/align]
[align=left] Array.Copy(ipBlock, i, temp, 0, 4);[/align]
[align=left] ipArray[ipIndex] = BitConverter.ToInt64(temp, 0);[/align]
[align=left] ipIndex++;[/align]
[align=left] }[/align]
[align=left] return ipArray;[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 从IP数组中搜索指定IP并返回其索引[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="ipArray">IP数组</param>[/align]
[align=left] ///<param name="start">指定搜索的起始位置</param>[/align]
[align=left] ///<param name="end">指定搜索的结束位置</param>[/align]
[align=left] ///<returns></returns>[/align]
[align=left] int SearchIP(long[] ipArray, int start, int end)[/align]
[align=left] {[/align]
[align=left] int middle = (start + end) / 2;[/align]
[align=left] if (middle == start)[/align]
[align=left] return middle;[/align]
[align=left] else if (ip < ipArray[middle])[/align]
[align=left] return SearchIP(ipArray, start, middle);[/align]
[align=left] else[/align]
[align=left] return SearchIP(ipArray, middle, end);[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 读取IP文件中索引区块[/align]
[align=left] ///</summary>[/align]
[align=left] ///<returns></returns>[/align]
[align=left] byte[] ReadIPBlock()[/align]
[align=left] {[/align]
[align=left] long startPosition = ReadLongX(4);[/align]
[align=left] long endPosition = ReadLongX(4);[/align]
[align=left] long count = (endPosition - startPosition) / 7 + 1;//总记录数[/align]
[align=left] ipFile.Position = startPosition;[/align]
[align=left] byte[] ipBlock = new byte[count * 7];[/align]
[align=left] ipFile.Read(ipBlock, 0, ipBlock.Length);[/align]
[align=left] ipFile.Position = startPosition;[/align]
[align=left] return ipBlock;[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 从IP文件中读取指定字节并转换位long[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="bytesCount">需要转换的字节数,主意不要超过8字节</param>[/align]
[align=left] ///<returns></returns>[/align]
[align=left] long ReadLongX(int bytesCount)[/align]
[align=left] {[/align]
[align=left] byte[] _bytes = new byte[8];[/align]
[align=left] ipFile.Read(_bytes, 0, bytesCount);[/align]
[align=left] return BitConverter.ToInt64(_bytes, 0);[/align]
[align=left] }[/align]
[align=left] ///<summary>[/align]
[align=left] /// 从IP文件中读取字符串[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="flag">转向标志</param>[/align]
[align=left] ///<returns></returns>[/align]
[align=left] string ReadString(int flag)[/align]
[align=left] {[/align]
[align=left] if (flag == 1 || flag == 2)//转向标志[/align]
[align=left] ipFile.Position = ReadLongX(3);[/align]
[align=left] else[/align]
[align=left] ipFile.Position -= 1;[/align]
[align=left] [/align]
[align=left] List<byte> list = new List<byte>();[/align]
[align=left] byte b = (byte)ipFile.ReadByte();[/align]
[align=left] while (b > 0)[/align]
[align=left] {[/align]
[align=left] list.Add(b);[/align]
[align=left] b = (byte)ipFile.ReadByte();[/align]
[align=left] }[/align]
[align=left] return Encoding.Default.GetString(list.ToArray());[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: