zldaring

新手上路

贴子 1

精华 0

积分 1

信用 0

竞猜 0

魅力 0

威望 0

现金 15 CZB

银行 0 CZB

黄金 0

比特币 0

注册时间 2007-09-01

发表于:2007-09-01 00:09:28   |  只看该作者   |  本帖随机奖励楼主:0 CZB   |  转账至  zldaring

dsd

用DISCUZ中的convertip函数可以读出某IP如121.23.115.89的地址为:河北省廊坊市
另外有些情况,如直辖市只有市名称,没有省字眼。

注意:请问怎么改动此函数,使其分别读出省单位,和市单位??

wry.dat为纯真IP数据库。后面是此convertip函数。


====================================
代码:
function convertip($ip) {
        if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
                return '';
        }

        if($fd = @fopen('./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 = $ip2num = $ip1num = 0;
                $ipAddr1 = $ipAddr2 = '';
                $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';

        }

}
====================================
楼主
编辑   |    引用    回帖
关闭    高亮    置顶   |    移动    回收站   |    -6删主题    删主题    |   
甘为汝逝

Joe Young

认证会员

生活像1把无情刻刀改变了我们模样 ...

贴子 20939

精华 2

积分 12051

信用 5

竞猜 5

魅力 2650

威望 3

现金 298 CZB

银行 0 CZB

黄金 0

比特币 0

注册时间 2007-08-16

发表于:2007-09-01 00:09:25   |  只看该作者   |  转账至  甘为汝逝
这个我不懂,楼主明天早晨9点后
来看回复好吗
沙发
编辑   |    引用    回帖
关闭    高亮    置顶   |    移动    回收站   |    -6删帖    删帖    |   
金狐

狐狸

管理员

贴子 138989

精华 13

积分 77006

信用 11

竞猜 20

魅力 23333

威望 8

现金 91094184 CZB

银行 7484412 CZB

黄金 8888

比特币 888

注册时间 2003-08-18

发表于:2007-09-01 10:09:58   |  只看该作者   |  转账至  金狐
把地址名称读取出来后,分析一下字符串就是了。
时间、时间、时间
板凳
编辑   |    引用    回帖
关闭    高亮    置顶   |    移动    回收站   |    -6删帖    删帖    |   
甘为汝逝

Joe Young

认证会员

生活像1把无情刻刀改变了我们模样 ...

贴子 20939

精华 2

积分 12051

信用 5

竞猜 5

魅力 2650

威望 3

现金 298 CZB

银行 0 CZB

黄金 0

比特币 0

注册时间 2007-08-16

发表于:2007-09-01 10:09:05   |  只看该作者   |  转账至  甘为汝逝
引用:
原帖由 金狐 于 2007-9-1 10:00 发表
把地址名称读取出来后,分析一下字符串就是了。
哈,老大自己跑来了

感谢老大
4楼
编辑   |    引用    回帖
关闭    高亮    置顶   |    移动    回收站   |    -6删帖    删帖    |