Хобрук: Ваш путь к мастерству в программировании

Заинтересованы в создании PHP-скрипта, который увеличивает IP-адрес с определенного начального адреса до определенного конечного адреса.

Я знаю, что могу сделать это легко, сначала преобразовав IP-адреса в десятичную запись, используя встроенные в PHP функции, такие как up2long и long2ip. Я просто хочу сделать то же самое, используя стандартную нотацию 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 до тех пор, пока первый октет начального адреса не совпадет с первым октетом конечного адреса. Затем выполните тот же блок кода для второго октета и так далее, пока программа не достигнет конечного адреса и не завершится.

Я только недавно начал учиться программировать, поэтому вполне возможно, что мое мышление и/или написание кода далеки от элегантности. Если бы вы хотели этого, как бы вы это сделали?

26.12.2009

Ответы:


1

Что-то вроде этого:

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

?>
26.12.2009
  • Да!!! Спасибо!!!! это работает, и я думаю, что это более эффективно, чем код, который я написал. Я писал код для этого, но, поскольку я был вдали от компьютера, я просто использовал ручку и бумагу. Дам его назад и опубликую, когда у меня будет мой. Ваш скрипт работает как шарм, еще раз спасибо. 26.12.2009

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

    3

    Приращение (Добавить к):

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

    Уменьшение (взять из):

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

    Чтобы протестировать обе функции, вы можете написать цикл for для генерации примерно 16 миллионов IP-адресов туда и обратно, вы можете направить вывод в файл и таким образом сохранить результаты.

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

    Если вам не нравится присваивать значения через объявления переменных, измените функции, чтобы вы могли использовать передавать по ссылке вместо этого.

    30.05.2020
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.