有兴趣制作一个PHP脚本,将IP地址从定义的起始地址增加到定义的结束地址

时间:2009-12-26 15:33:32

标签: php ip-address range

我知道我可以通过使用PHP内置函数(如up2longlong2ip)将IP地址转换为十进制表示法来轻松完成此操作。我只是希望能够使用标准IP地址表示法作为练习。

我想的问题是这样的:给定一个起始IP地址,比如说192.168.1.100,结束IP地址,比如说201.130.22.10。使程序打印该范围内的所有地址编号(192.168.1.100,192.168.1.101,...,201.130.22.9,201.130.22.10)。

我在考虑可能的方法是在for条件内建立嵌套的while循环,直到起始地址的第一个八位字节与结束地址的第一个八位字节匹配。然后为第二个八位字节执行相同的代码块,依此类推,直到程序到达结束地址并完成。

我刚刚开始学习编程,所以很有可能我的思考和编写代码远非优雅。如果你这样做,你会怎么做?

4 个答案:

答案 0 :(得分:6)

这样的事情:

<?php

// works only for valid range
$start_ip = '10.0.0.1';
$end_ip = '10.0.20.1';

$start_arr = explode('.',$start_ip);
$end_arr = explode('.',$end_ip);

while($start_arr <= $end_arr)
{
    echo implode('.',$start_arr) . '<br>';

    $start_arr[3]++;
    if($start_arr[3] == 256)
    {
        $start_arr[3] = 0;
        $start_arr[2]++;
        if($start_arr[2] == 256)
        {
            $start_arr[2] = 0;
            $start_arr[1]++;
            if($start_arr[1] == 256)
            {
                $start_arr[1] = 0;
                $start_arr[0]++;
            }
        }
    }
}

?>

答案 1 :(得分:2)

这不那么复杂了:

<?php

// works only for valid range
$start_ip = ip2long('10.0.0.1');
$end_ip = ip2long('10.0.20.1');

while($start_ip <= $end_ip){
  echo long2ip($start_ip).'<br>';
  $start_ip++;
}

?>

答案 2 :(得分:0)

function getInBetweenIPs($startIP,$endIP){

    $subIPS = array();
    $start_ip = ip2long($startIP);
    $end_ip = ip2long($endIP);

    while($start_ip <= $end_ip){
        $subIPS[]=long2ip($start_ip);
        $start_ip++;
    }

    return $subIPS;
}

答案 3 :(得分:0)

增加(添加到):

exports.addFile = async (req, res) => {
    try {
        console.log(req.body)

        return res.status(200).send({
            message: "Ok"
        })
    } catch (e) {
        return res.status(500).send({
            message: e.message
        })
    }

减量(取自):

<?php

function ipinc($i): string {
    $i = explode(".", $i);

    $a = $i[0];
    $b = $i[1];
    $c = $i[2];
    $d = $i[3];

    $d++;

    if ($d > 255) {
        $d = 0;
        $c++;
    }

    if ($c > 255) {
        $c = 0;
        $b++;
    }

    if ($b > 255) {
        $b = 0;
        $a++;
    }

    if ($a > 255) {
        die("IPv4 Range Exceeded");
    }

    return "$a.$b.$c.$d";
}

?>

要测试这两个功能,可以编写一个for循环来回生成大约1600万个IP地址,可以将输出通过管道传输到文件并以这种方式存储结果。

<?php

function ipdec($i) {
    $i = explode(".", $i);

    $a = $i[0];
    $b = $i[1];
    $c = $i[2];
    $d = $i[3];

    $d--;

    if ($d < 0) {
        $d = 255;
        $c--;
    }

    if ($c < 0) {
        $c = 255;
        $b--;
    }

    if ($b < 0) {
        $b = 255;
        $a--;
    }

    if ($a < 0) {
        die("IPv4 Range Exceeded");
    }

    return "$a.$b.$c.$d";
}

?>

如果您不喜欢通过变量声明分配值,请修改函数,以便可以使用pass by reference