|
源代码网推荐
以下为引用的内容: /** * 这个函数看着很长,其实要实现的功能很少,就是通过ip地址返回一个对应的地理位置 * @para string $ip //给定的ip,要符合点分十进制 * * @return string */ function convertip($ip) { if(!preg_match("/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/", $ip)) { return ""; }
if($fd = @fopen(DISCUZ_ROOT."./ipdata/wry.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;
} else {
$datadir = DISCUZ_ROOT."./ipdata/"; $ip_detail = explode(".", $ip); if(file_exists($datadir.$ip_detail[0].".txt")) { $ip_fdata = @fopen($datadir.$ip_detail[0].".txt", "r"); } else { if(!($ip_fdata = @fopen($datadir."0.txt", "r"))) { return "- Invalid IP data file"; } } for($i = 0; $i <= 3; $i++) { $ip_detail[$i] = sprintf("%03d", $ip_detail[$i]); } $ip = join(".", $ip_detail); do { $ip_data = fgets($ip_fdata, 200); $ip_data_detail = explode("|", $ip_data); if($ip >= $ip_data_detail[0] && $ip <= $ip_data_detail[1]) { fclose($ip_fdata); return "- ".$ip_data_detail[2].$ip_data_detail[3]; } } while(!feof($ip_fdata)); fclose($ip_fdata); return "- UNKNOWN";
}
} |
源代码网整理以下
源代码网供稿. |