скрипт расчета сети

Тема в разделе "PHP Pro", создана пользователем BKK, 27 июн 2011.

Статус темы:
Закрыта.
  1. BKK

    BKK

    Регистр.:
    21 окт 2009
    Сообщения:
    163
    Симпатии:
    45
    PHP:
    <?php 
    header
    ("Content-Type: text/html;charset=windows-1251");
    function 
    getip() {
        if(
    getenv("HTTP_CLIENT_IP")) {
            
    $ip getenv("HTTP_CLIENT_IP");
        } elseif(
    getenv("HTTP_X_FORWARDED_FOR")) {
            
    $ip getenv("HTTP_X_FORWARDED_FOR");
        } else {
            
    $ip getenv("REMOTE_ADDR");
        }
    $ip htmlspecialchars(substr($ip,0,15), ENT_QUOTES);
    return 
    $ip;
    }
    function 
    valid_ipv4($ip_addr)
    {
           
    $num="(\*|[0-9]{1,3}|^1?\d\d$|2[0-4]\d|25[0-5])";

           if(
    preg_match("/$num\.$num\.$num\.$num/",$ip_addr,$matches))
           {
    return 
    TRUE;
           } else {
                   return 
    FALSE;
           }
    }
    function 
    octet($net_mask)
    {
    if(
    $net_mask >=&& $net_mask <=7) return $octet = array("1""0");
    elseif(
    $net_mask >=&& $net_mask <=15) return $octet = array("2""8");
    elseif(
    $net_mask >=16 && $net_mask <=24) return $octet = array("3""16");
    elseif(
    $net_mask >=25 && $net_mask <=32) return $octet = array("4""25");
    else return 
    $octet = array("0""0");
    }
    function 
    replace_ones($a)
    {
          if(
    $a == "0") return array("00000000""256");
    elseif(
    $a == "1") return array("10000000""128"); 
    elseif(
    $a == "2") return array("11000000""64"); 
    elseif(
    $a == "3") return array("11100000""32"); 
    elseif(
    $a == "4") return array("11110000""16"); 
    elseif(
    $a == "5") return array("11111000""8"); 
    elseif(
    $a == "6") return array("11111100""4"); 
    elseif(
    $a == "7") return array("11111110""2"); 
    elseif(
    $a == "8") return array("11111111""1"); 
    else return 
    FALSE;
    }
    function 
    mask_detect($oktet$shag)

      
    $a $oktet;
      if(
    $a == "1"
      {
      
    $oktet_value replace_ones($shag);
    $oktet_value $oktet_value['0'];
      return 
    "{$oktet_value}.00000000.00000000.00000000";
      }
      elseif(
    $a == "2"
      {
       
    $oktet_value replace_ones($shag);
    $oktet_value $oktet_value['0'];
      return 
    "11111111.{$oktet_value}.00000000.00000000";
      }
      elseif(
    $a == "3"
      {
       
    $oktet_value replace_ones($shag);
    $oktet_value $oktet_value['0'];
      return 
    "11111111.11111111.{$oktet_value}.00000000";
      }
      elseif(
    $a == "4"
      {
       
    $oktet_value replace_ones($shag);
    $oktet_value $oktet_value['0'];
      return 
    "11111111.11111111.11111111.{$oktet_value}";
      }
    else return 
    FALSE;
    }
    function 
    math_ip($a$b)
    {
    if(
    $b != 0)
    {
    $p $a $b;
    $f floor($p) * $b;
    return 
    $f;
    }
    else return 
    $a;
    }

    $ip_value $_POST['ip'];
    $net_mask intval($_POST['net_mask']);
    if(empty(
    $net_mask)) $net_mask 0;
    $ip explode("."$ip_value);
    $bin_ip "".decbin($ip[0]).".".decbin($ip[1]).".".decbin($ip[2]).".".decbin($ip[3])."";
    $oktet_array octet($net_mask);
    $shag_x $net_mask $oktet_array['1'];
    $shag replace_ones($shag_x);
    $shag $shag['1'];
    $maska mask_detect($oktet_array['0'], $shag_x);
    $mask explode("."$maska);
    $mask "".bindec($mask[0]).".".bindec($mask[1]).".".bindec($mask[2]).".".bindec($mask[3])."";
    $x pow("2", (32 $net_mask));
    $all_ip_in_net $x 2;
    $oktet $oktet_array['0'];

      if(
    $oktet == "1")
      {
         
    $net_value math_ip($ip[0], $shag);
         
    $net "{$net_value}.0.0.0";
         
    $min "{$net_value}.1.0.0";
         
    $max "".$ip[0].".255.255.254";
         
    $broadcast "".$ip[0].".255.255.255";
      }
      elseif(
    $oktet == "2")
      {
         
    $net_value math_ip($ip[1], $shag);
         
    $net "".$ip[0].".{$net_value}.0.0";
         
    $min "".$ip[0].".{$net_value}.1.0";
         
    $max "".$ip[0].".".$ip[1].".255.254";
         
    $broadcast "".$ip[0].".".$ip[1].".255.255";
      }
      elseif(
    $oktet == "3")
      {
         
    $net_value math_ip($ip[2], $shag);
         
    $net "".$ip[0].".".$ip[1].".{$net_value}.0";
         
    $min "".$ip[0].".".$ip[1].".{$net_value}.1";
         
    $max "".$ip[0].".".$ip[1].".".$ip[2].".254";
         
    $broadcast "".$ip[0].".".$ip[1].".".$ip[2].".255";
      }
      elseif(
    $oktet == "4")
      {
         
    $net_value math_ip($ip[3], $shag);
         
    $net "".$ip[0].".".$ip[1].".".$ip[2].".{$net_value}";
    $next_net_value $net_value 1;
         
    $min "".$ip[0].".".$ip[1].".".$ip[2].".{$next_net_value}";
    $next_net_value $net_value $all_ip_in_net;
         
    $max "".$ip[0].".".$ip[1].".".$ip[2].".{$next_net_value}";
    $next_net_value $next_net_value 1;
         
    $broadcast "".$ip[0].".".$ip[1].".".$ip[2].".{$next_net_value}";
      }
    else 
    {
    $net NULL;
    $min NULL;
    $max NULL;
    $broadcast NULL;
    }

    $my_ip getip();
    if(!isset(
    $_POST['send']))
    {
    echo <<<HTML
    <form action="" method="post">
    IP: <input type="text" name="ip" value="
    {$my_ip}">
    Маска сети: <input type="text" name="net_mask" value="">
    <input type="submit" name="send" value="Расчитать">
    </form>
    HTML;
    }
    if(isset(
    $_POST['send']) && !valid_ipv4($_POST['ip']))
    {
    echo 
    "Введенный IP не соответсвует формату IPv4";
    }
    if(isset(
    $_POST['send']) && valid_ipv4($_POST['ip']))
    {
    echo 
    "<b>IP:</b> ".$ip[0].".".$ip[1].".".$ip[2].".".$ip[3]."/$net_mask\n<br>"
    echo 
    "<b>IP BIN:</b> $bin_ip\n<br>";
    echo 
    "<b>Маска:</b> $mask\n<br>"
    echo 
    "<b>Маска BIN:</b> $maska\n<br>"
    echo 
    "<b>Сеть</b>: $net\n<br>"
    echo 
    "<b>Адресов в сети:</b> $all_ip_in_net\n<br>";
    echo 
    "<br><b>Диапазон</b><br>";
    echo 
    "<b>от:</b> $min <b>до</b> $max\n<br>";
    echo 
    "<b>Broadcast:</b> $broadcast\n<br>";
    echo 
    "<b>ШАГ СЕТИ:</b> $shag\n<br>";
    echo 
    "<b>ОКТЕТ:</b> $oktet\n<br>";
    }
    ?>
    Написал скрипт, есть подозрение, что алгоритм ошибочный в определении диапазона сети
     
  2. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    183
    Симпатии:
    75
    Ошибочный.
    • Введение /25 маски выдаёт результат 255.255.255.0 (должно быть 255.128)
    • Введение /26 маски выдаёт результат 255.255.255.128 (должно быть 255.192)
    • Некорректный расчёт, если вводить сеть, начинающуюся не с .0, например 192.168.1.64/255.255.255.192 (26-я сетка).
    Сильнее углубляться смысла не видел, скрипт довольно мрачный.
    И зачем изобретать велосипед? http://sourceforge.net/projects/subntcalc/
     
    Extalionez нравится это.
Статус темы:
Закрыта.