alexis
alexis

Reputation: 51

Interested in making a PHP script that increments IP address from defined starting address to defined ending address

I know I can do this easily by converting the IP addresses to decimal notation first using PHP built in functions like up2long and long2ip. I just want to be able to do the same using the standard IP address notation as an exercise.

The problem I am thinking goes like this: Given an starting IP address, say 192.168.1.100, and an ending IP address, say 201.130.22.10. Make the program that prints all the address numbers in that range (192.168.1.100, 192.168.1.101, … , 201.130.22.9, 201.130.22.10).

I was thinking that maybe the way to go would be to make a nested for loop inside a while condition until the first octet of the starting address matches the first octet of the ending address. Then execute the same block of code for the second octet and so on until the program reaches the ending address and finished.

I just started learning to program recently so it is quite possible that my of thinking and or writing code is far from elegant. If you were to this, how would you do it?

Upvotes: 5

Views: 2530

Answers (4)

user7090116
user7090116

Reputation:

Increment (Add to):

<?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";
}

?>

Decrement (Take from):

<?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";
}

?>

To test both functions, you can write a for loop to generate approximately 16 million IP addresses back and forth, you can pipe the output to a file and store the results that way.

<?php

require 'function.ipinc.php';
require 'function.ipdec.php';

print("Increment:\n");
for ($i = 0, $ip = "100.0.0.0"; $i <= 16777215; $i++) {
    print("$ip\n");
    $ip = ipinc($ip);
}
print("----------\n");

print("Decrement:\n");
for ($i = 0, $ip = "100.255.255.255"; $i <= 16777215; $i++) {
    print("$ip\n");
    $ip = ipdec($ip);
}
print("----------\n");

die("Finished!\n");

?>

If you don't like assigning values through variable declarations, modify the functions so you can use pass by reference instead.

Upvotes: 0

Abdul Jabbar
Abdul Jabbar

Reputation: 442

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;
}

Upvotes: 0

Steve Veerman
Steve Veerman

Reputation: 114

This is much less complicated:

<?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++;
}

?>

Upvotes: 5

codaddict
codaddict

Reputation: 455440

Something like this:

<?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]++;
            }
        }
    }
}

?>

Upvotes: 7

Related Questions