根据IP地址获得地理位置

    ///<summary>
    /// 提供从纯真IP数据库搜索IP信息的方法;
    ///</summary>
    public class IPSelect
    {
        FileStream ipFile;
        long ip;
        public string ipfilePath;
        ///<summary>
        /// 构造函数
        ///</summary>
        ///<param name="ipfilePath">纯真IP数据库路径</param>
        public IPSelect()
        {
            ipfilePath = "纯真IP数据库路径";//TextUtility.GetFullPath( Utility.GetIPDbFilePath );
        }

        ///<summary>
        /// 地理位置,包括国家和地区
        ///</summary>
        public struct IPLocation
        {
            public string country, area;
        }

        ///<summary>
        /// 获取指定IP所在地理位置实体
        ///</summary>
        ///<param name="strIP">要查询的IP地址</param>
        ///<returns></returns>
        public string GetIPLocation( string strIP )
        {
            if (!File.Exists(ipfilePath))
            {
                return "";
            }
            ip = IPToLong( strIP );    //将字符串形式的IP转换位long
            IPLocation loc = new IPLocation();
            try
            {
                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

                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;
            }
            catch
            {
                return "";
            }
            return loc.country + loc.area;
        }
        ///<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() );
        }
    }
        /// <summary>
        /// 根据IP的地理位置
        /// </summary>
        /// <param name="IP">IP</param>
        /// <returns>地理位置</returns>
        protected string GetAddressWithIP(string IP)
        {
            IPSelect IPSelect = new IPSelect();
            if (string.IsNullOrEmpty(IP))
            {
                IP = "127.0.0.1";
            }
            return IPSelect.GetIPLocation(IP);
        }

纯真IP数据库格式文档在 百度云网盘的"编程工具文件"文件夹下

时间: 2024-10-14 12:05:43

根据IP地址获得地理位置的相关文章

php获取用户真实ip地址与地理位置

echo getcposition(getIP()); //获取用户真实ip function getIP() { if (isset($_SERVER)) { if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) { $realip = $_SERVER[HTTP_X_FORWARDED_FOR]; } elseif (isset($_SERVER[HTTP_CLIENT_IP])) { $realip = $_SERVER[HTTP_CLIENT_IP]; }

MFC C++ 获取外网IP地址

#include <afxinet.h> //GB2312 转换成 Unicode wchar_t* GB2312ToUnicode(const char* szGBString) { UINT nCodePage = 936; //GB2312 int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0); wchar_t* pBuffer = new wchar_t[nLength+1]; MultiByteToWide

我的 IP 地址(View IP address)

插件介绍: 很多时候我们需要使用到IP地址,这个名词可能人人都知道,但是你知道怎么查看你自己的IP地址吗?今天为大家推荐一款查看IP地址的插件.我的 IP 地址(View IP address),此应用程序显示有关您的 IP 地址,例如地理定位. ISP. DNS,详细的信息 whois,路由. 托管. 域的邻居,DNSBL,BGP 和 ASN 信息. 使用说明: 将我的 IP 地址(View IP address)添加至chrome,并在扩展器中启动它. 功能介绍: -像 ISP. ASN.

5款实用的IP地址跟踪工具

IP地址是每台计算机的唯一标识符,它基本上是一串数字,并以句点分隔.IP地址主要用于定位和识别计算机,这有点像我们人类的视网膜或者指纹.垃圾邮件发送者和黑客通常会代理自己的IP地址,让我们难以识别其真实的IP地址.然而,值得注意的是,IP地址的物理位置不一定是计算机的位置. Geotool Geotool是最简单的IP地址查询网站之一,它可提供有关IP地址的足够信息,而你只需要将IP地址输入底部框中即可.该网站将为你提供主机名(ISP).国家.城市.邮政编码.当地时间.经度和纬度.该网站还会在谷

php获取ip地址所在的地理位置的实现

1,通过腾讯或者新浪提供的接口来获取(新浪和腾讯类似) <?php    function getIPLocation($queryIP){     $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP; //如果是新浪,这里的URL是:'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip='.$queryIP;     $ch = curl

域名查询IP及公网IP地址地理位置查询

#!/bin/bash printf "本脚本包含ip地理位置查询及已知域名查询IP \n" printf "###################################### \n" printf "/tmp/dns.txt 需要查询的域名列表目录 \n" printf "/tmp/dns_ip.txt 存放查询后的域名及IP对应目录 \n" printf "#######################

用户Ip地址和百度地图api接口获取用户地理位置(经纬度坐标,城市)

<?php //获取用户ip(外网ip 服务器上可以获取用户外网Ip 本机ip地址只能获取127.0.0.1) function getip(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])){ $cip = $_SERVER["HTTP_CLIENT_IP"]; } else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){ $cip = $_SERVER[&quo

wireshark ip地址库添加

wireshark ip地址库添加.md http://www.iprotocolsec.com/2011/09/13/wireshark使用技巧-geoip显示ip地理位置/http://www.iprotocolsec.com/2011/08/24/修改wireshark-显示报文进程名称/http://www.iprotocolsec.com/2012/11/07/wireshark技巧-解密ssl协议/ 来自为知笔记(Wiz)

解析纯真IP地址库

一周以来,一直在做 IP地址库的解析.从调研到编码到优化,大概花了有七八天的时间.感觉很好玩.总结一下整个做的过程. 1.关于IP 地址库的解析方式 目前主要的解析方式有两种:通过API,或通过IP数据库. API方式很简单,目前国内大厂不少提供API接口,只要发送请求的IP,就能获得相应的地理位置.像BAT等等公司都提供IP查询接口.这种解析方式的好处在于,编码简单,一个请求获得数据,然后解析一下就好了(通常只是个json数据),而且不用维护数据库,对本地没有负担.但是缺点也挺明显的,首先是慢