asp.net/C#读取纯真IP数据库

C#读取纯真IP数据库
免费下载地址:http://download.csdn.net/detail/virone/4568159

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace 纯真IP数据库研究

{

    ///<summary>

    /// 提供从纯真IP数据库搜索IP信息的方法;

    /// 感谢LumaQQ提供纯真IP数据库格式文档;

    ///</summary>

    public class
IPSearch

    {

        FileStream ipFile;

        long ip;

        string ipfilePath;

 

        ///<summary>

        /// 构造函数

        ///</summary>

        ///<param name="ipfilePath">纯真IP数据库路径</param>

        public IPSearch(string ipfilePath)

        {

           
this.ipfilePath = ipfilePath;

        }

        //测试

        static
void Main(string[] args)

        {

           
string ipfilePath = @"C:/Documents and Settings/Daode/桌面/qqwry/QQWry.dat";

           
IPSearch ipSearch = new
IPSearch(ipfilePath);

           
string ip = "72.51.27.51";

           
IPSearch.IPLocation loc = ipSearch.GetIPLocation(ip);

           
Console.WriteLine("你查的ip是:{0} 地理位置:{1} {2}", ip, loc.country, loc.area);

           
Console.ReadKey();

        }

        ///<summary>

        /// 地理位置,包括国家和地区

        ///</summary>

        public struct
IPLocation

        {

           
public string country, area;

        }

        ///<summary>

        /// 获取指定IP所在地理位置

        ///</summary>

        ///<param name="strIP">要查询的IP地址</param>

        ///<returns></returns>

        public
IPLocation GetIPLocation(string strIP)

        {

            ip = IPToLong(strIP);

            ipFile =
new FileStream(ipfilePath,
FileMode.Open, FileAccess.Read);

           
long[] ipArray = BlockToArray(ReadIPBlock());

           
long offset = SearchIP(ipArray, 0, ipArray.Length - 1) * 7 + 4;

            ipFile.Position += offset;//跳过起始IP

            ipFile.Position = ReadLongX(3) + 4;//跳过结束IP

 

           
IPLocation loc = new
IPLocation();

           
int flag = ipFile.ReadByte();//读取标志

           
if (flag == 1)//表示国家和地区被转向

            {

                ipFile.Position = ReadLongX(3);

                flag = ipFile.ReadByte();//再读标志

            }

           
long countryOffset = ipFile.Position;

            loc.country = ReadString(flag);

 

           
if (flag == 2)

            {

                ipFile.Position = countryOffset + 3;

            }

            flag = ipFile.ReadByte();

            loc.area = ReadString(flag);

 

            ipFile.Close();

            ipFile =
null;

           
return loc;

        }

        ///<summary>

        /// 将字符串形式的IP转换位long

        ///</summary>

        ///<param name="strIP"></param>

        ///<returns></returns>

        public
long IPToLong(string strIP)

        {

           
byte[] ip_bytes = new
byte[8];

           
string[] strArr = strIP.Split(new
char[] { '.' });

           
for (int i = 0; i < 4; i++)

            {

                ip_bytes[i] =
byte.Parse(strArr[3 - i]);

            }

           
return BitConverter.ToInt64(ip_bytes, 0);

        }

        ///<summary>

        /// 将索引区字节块中的起始IP转换成Long数组

        ///</summary>

        ///<param name="ipBlock"></param>

        long[] BlockToArray(byte[] ipBlock)

        {

           
long[] ipArray = new
long[ipBlock.Length / 7];

           
int ipIndex = 0;

           
byte[] temp = new
byte[8];

           
for (int i = 0; i < ipBlock.Length; i += 7)

            {

               
Array.Copy(ipBlock, i, temp, 0, 4);

                ipArray[ipIndex] =
BitConverter.ToInt64(temp, 0);

                ipIndex++;

            }

           
return ipArray;

        }

        ///<summary>

        /// 从IP数组中搜索指定IP并返回其索引

        ///</summary>

        ///<param name="ipArray">IP数组</param>

        ///<param name="start">指定搜索的起始位置</param>

        ///<param name="end">指定搜索的结束位置</param>

        ///<returns></returns>

        int SearchIP(long[] ipArray,
int start, int end)

        {

           
int middle = (start + end) / 2;

           
if (middle == start)

               
return middle;

           
else if (ip < ipArray[middle])

               
return SearchIP(ipArray, start, middle);

           
else

               
return SearchIP(ipArray, middle, end);

        }

        ///<summary>

        /// 读取IP文件中索引区块

        ///</summary>

        ///<returns></returns>

        byte[] ReadIPBlock()

        {

           
long startPosition = ReadLongX(4);

           
long endPosition = ReadLongX(4);

           
long count = (endPosition - startPosition) / 7 + 1;//总记录数

            ipFile.Position = startPosition;

           
byte[] ipBlock = new
byte[count * 7];

            ipFile.Read(ipBlock, 0, ipBlock.Length);

            ipFile.Position = startPosition;

           
return ipBlock;

        }

        ///<summary>

        /// 从IP文件中读取指定字节并转换位long

        ///</summary>

        ///<param name="bytesCount">需要转换的字节数,主意不要超过8字节</param>

        ///<returns></returns>

        long ReadLongX(int bytesCount)

        {

           
byte[] _bytes = new
byte[8];

            ipFile.Read(_bytes, 0, bytesCount);

           
return BitConverter.ToInt64(_bytes, 0);

        }

        ///<summary>

        /// 从IP文件中读取字符串

        ///</summary>

        ///<param name="flag">转向标志</param>

        ///<returns></returns>

        string ReadString(int flag)

        {

           
if (flag == 1 || flag == 2)//转向标志

                ipFile.Position = ReadLongX(3);

           
else

                ipFile.Position -= 1;

 

           
List<byte> list =
new List<byte>();

           
byte b = (byte)ipFile.ReadByte();

           
while (b > 0)

            {

                list.Add(b);

                b = (byte)ipFile.ReadByte();

            }

           
return Encoding.Default.GetString(list.ToArray());

        }

    }

}

时间: 2024-10-01 17:51:30

asp.net/C#读取纯真IP数据库的相关文章

php读取纯真ip数据库使用示例

 这篇文章主要介绍了php读取纯真ip数据库显示详细信息的使用示例,大家参考使用吧  代码如下: <?php /*--------------------------------------------------  ip2address [qqwry.dat] --------------------------------------------------*/   class ip {  var $fh; //IP数据库文件句柄  var $first; //第一条索引  var $las

读取纯真IP数据库的公用组件接口QQWry.NET_实用技巧

这是一个读取纯真IP数据库的公用组件接口,我是通过luma的<纯真IP数据库格式详解>了解了纯真IP数据库数据格式,并且基于网络上的一个IPLocation.dll源码的基础改编而来.我为什么要改编这个组件呢?因为我看到这个组件在使用过程中,每次都要打开文件流,并且整个接口使用静态的属性.并不适合Web环境下,多线程并发查询的需求,并且在性能上也不是最优.有了luma的格式详解,和现有的IPLocation.dll的源码,使我的工作变得异常的简单.出现的一个小错误,也是经过一次调试后就解决了.

php读取纯真ip数据库使用示例_php实例

复制代码 代码如下: <?php/*-------------------------------------------------- ip2address [qqwry.dat]--------------------------------------------------*/ class ip { var $fh; //IP数据库文件句柄 var $first; //第一条索引 var $last; //最后一条索引 var $total; //索引总数  //构造函数 functio

Discuz 5.0 中读取纯真IP数据库函数分析

函数|数据|数据库 Discuz  5.0 不在使用自己的IP数据,而是使用纯真IP的数据格式, 存取纯真IP数据库稍微有点麻烦,它的存储格式比较特殊也很有趣,具体的格式分析参考下面两个链接,其他语言实现参考文章末的链接. <纯真IP数据库格式详解>链接一:http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx链接二:http://lumaqq.linuxsir.org/article/qqwry_format_detail

UTF-8使用纯真IP数据库乱码问题

最近手头在写一个根据IP地址返回省份地区的代码,发现在使用纯真ip数据库的时候出现乱码,最后发现纯真数据库是居于GBK编码的,而我的整个工程编码都是采用的UTF-8编码,两个走到一起肯定会出现乱码,所以只能改写纯真读取ip的类 <% '得到访问者IP public Function getip() Dim strIPAddr If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Req

PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)_php实例

如下所示: <?php $data = '254.254.254.254'; echo ip2long($data); function getIP() { if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); elseif(getenv

Discuz 5.0 中读取纯真IP数据库函数分析_php技巧

Discuz  5.0 不在使用自己的IP数据,而是使用纯真IP的数据格式, 存取纯真IP数据库稍微有点麻烦,它的存储格式比较特殊也很有趣,具体的格式分析参考下面两个链接,其他语言实现参考文章末的链接. <纯真IP数据库格式详解> 链接一:http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx 链接二:http://lumaqq.linuxsir.org/article/qqwry_format_detail.html 纯真

纯真IP数据库格式图文详解_应用技巧

摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其内幕,不过那份文档寥寥数语,也是颇为耐心才读明白.在这里我重写一份,以此做为LumaQQ开发者文档的一部分,我想还是必要的.本文详细介绍了纯真IP数据库的格式,并且给出了一些Demo以供参考. Luma, 清华大学修改日期: 2005/01/14 Note: 在此感谢纯真IP数据库作者金狐和那唯一一份文档的作者. 修改历史

python访问纯真IP数据库的代码_python

核心代码: #!/usr/bin/env python # -*- coding: utf-8 -*- from bisect import bisect _LIST1, _LIST2 = [], [] _INIT = False ip2int = lambda ip_str: reduce(lambda a, b: (a << 8) + b, [int(i) for i in ip_str.split('.')]) def _init(): global _LIST, _INIT if no