家园首页 Php4手册 我的相册 家园下载 个人文集 给我留言
我形我塑,网络相册,www.5x54.com 相册 相册 心情相册,少女相册 免费申请,我形我塑免费相册
 家园 个人文集   http://www.5x54.com
 


从DZ扣出来的通过ip判断省份、城市、线路、位置的代码


作者:网上收集    点击: 读取中...

引用代码: <?php
/***************************************************************************
*                CvIp.php
*            ------------------------------
*      Date            :  Sep  7,  2007
*      Copyright      :  [Discuz!]  (C)  Comsenz  Inc.
*      Mail            :  
*      Desc.            :  IP地址获取真实地址函数
*      History            :
*            Date    :
*            Author  :
*            Modif.  :
*      Usage  Example  :  
            echo  CvIp('218.56.198.104');
            //返回  山东省济南市  网通ADSL
            //如果参数为空则自动获取ip
***************************************************************************/

function  CvIp($ip='')
{
      if(empty(
$ip))  $ip  =  _Cv_Get_Ip();
      if(!
preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",  $ip))  {  return  false;  }
      if(
$fd  =  @fopen(dirname(__FILE__).'/QQWry.Dat',  'rb'))
      {
            
$ip      =  explode('.',  $ip);
            
$ipNum    =  $ip[0]*16777216  +  $ip[1]*65536  +  $ip[2]*256  +  $ip[3];
            
$DataBegin  =  fread($fd,  4);
            
$DataEnd  =  fread($fd,  4);
            
$ipbegin  =  implode('',  unpack('L',  $DataBegin));

            if(
$ipbegin  <  0)  $ipbegin  +=  pow(2,  32);
            
$ipend  =  implode('',  unpack('L',  $DataEnd));
            if(
$ipend  <  0)  $ipend  +=  pow(2,  32);
            
$ipAllNum  =  ($ipend  -  $ipbegin)  /  7  +  1;
            
$BeginNum  =  0;
            
$EndNum  =  $ipAllNum;

            while(
$ip1num  >  $ipNum  ||  $ip2num  <  $ipNum)
            {
                
$Middle=  intval(($EndNum  +  $BeginNum)  /  2);

                
fseek($fd,  $ipbegin  +  7  *  $Middle);
                
$ipData1  =  fread($fd,  4);
                if(
strlen($ipData1)  <  4)  {
                      
fclose($fd);
                      return  
'System  Error';
                }

                
$ip1num  =  implode('',  unpack('L',  $ipData1));
                if(
$ip1num  <  0)  $ip1num  +=  pow(2,  32);

                if(
$ip1num  >  $ipNum)  {
                      
$EndNum  =  $Middle;
                      continue;
                }

                
$DataSeek  =  fread($fd,  3);
                if(
strlen($DataSeek)  <  3)  {
                      
fclose($fd);
                      return  
'System  Error';
                }

                
$DataSeek  =  implode('',  unpack('L',  $DataSeek.chr(0)));
                
fseek($fd,  $DataSeek);
                
$ipData2  =  fread($fd,  4);
                if(
strlen($ipData2)  <  4)  {
                      
fclose($fd);
                      return  
'System  Error';
                }

                
$ip2num  =  implode('',  unpack('L',  $ipData2));
                if(
$ip2num  <  0)  $ip2num  +=  pow(2,  32);
                if(
$ip2num  <  $ipNum)  {
                      if(
$Middle  ==  $BeginNum)  {
                            
fclose($fd);
                            return  
'Unknown';
                      }
                      
$BeginNum  =  $Middle;
                }
            }

            
$ipFlag  =  fread($fd,  1);
            if(
$ipFlag  ==  chr(1))
            {
                
$ipSeek  =  fread($fd,  3);
                if(
strlen($ipSeek)  <  3)  {
                      
fclose($fd);
                      return  
'System  Error';
                }

                
$ipSeek  =  implode('',  unpack('L',  $ipSeek.chr(0)));
                
fseek($fd,  $ipSeek);
                
$ipFlag  =  fread($fd,  1);
            }

            if(
$ipFlag  ==  chr(2))  {
                
$AddrSeek  =  fread($fd,  3);
                if(
strlen($AddrSeek)  <  3)  {
                      
fclose($fd);
                      return  
'System  Error';
                }
                
$ipFlag  =  fread($fd,  1);
                if(
$ipFlag  ==  chr(2))  {
                      
$AddrSeek2  =  fread($fd,  3);
                      if(
strlen($AddrSeek2)  <  3)  {
                            
fclose($fd);
                            return  
'System  Error';
                      }
                      
$AddrSeek2  =  implode('',  unpack('L',  $AddrSeek2.chr(0)));
                      
fseek($fd,  $AddrSeek2);
                }  else  {
                      
fseek($fd,  -1,  SEEK_CUR);
                }

                while((
$char  =  fread($fd,  1))  !=  chr(0))
                      
$ipAddr2  .=  $char;

                
$AddrSeek  =  implode('',  unpack('L',  $AddrSeek.chr(0)));
                
fseek($fd,  $AddrSeek);

                while((
$char  =  fread($fd,  1))  !=  chr(0))
                      
$ipAddr1  .=  $char;
            }  else  {
                
fseek($fd,  -1,  SEEK_CUR);
                while((
$char  =  fread($fd,  1))  !=  chr(0))
                      
$ipAddr1  .=  $char;

                
$ipFlag  =  fread($fd,  1);
                if(
$ipFlag  ==  chr(2))  {
                      
$AddrSeek2  =  fread($fd,  3);
                      if(
strlen($AddrSeek2)  <  3)  {
                            
fclose($fd);
                            return  
'System  Error';
                      }
                      
$AddrSeek2  =  implode('',  unpack('L',  $AddrSeek2.chr(0)));
                      
fseek($fd,  $AddrSeek2);
                }  else  {
                      
fseek($fd,  -1,  SEEK_CUR);
                }
                while((
$char  =  fread($fd,  1))  !=  chr(0))
                      
$ipAddr2  .=  $char;
            }
            
fclose($fd);

            if(
preg_match('/http/i',  $ipAddr2))  {
                
$ipAddr2  =  '';
            }

            
$ipaddr  =  "$ipAddr1  $ipAddr2";
            
$ipaddr  =  preg_replace('/CZ88\.NET/is',  '',  $ipaddr);
            
$ipaddr  =  preg_replace('/^\s*/is',  '',  $ipaddr);
            
$ipaddr  =  preg_replace('/\s*$/is',  '',  $ipaddr);
            if(
preg_match('/http/i',  $ipaddr)  ||  $ipaddr  ==  '')  {
                
$ipaddr  =  'Unknown';
            }

            return  
$ipaddr;
      }
}

function  
_Cv_Get_Ip()
{
      
$_IpArray  =  array($_SERVER['HTTP_X_FORWARDED_FOR'],  $_SERVER['HTTP_CLIENT_IP'],  $_SERVER['REMOTE_ADDR'],  getenv('REMOTE_ADDR'));
      
rsort($_IpArray);
      
reset($_IpArray);
      return  
$_IpArray[0];
}

收藏此文章     打印  更新     编辑此文章    『关闭窗口』