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

Статус
В этой теме нельзя размещать новые ответы.

BKK

Профессор
Регистрация
21 Окт 2009
Сообщения
157
Реакции
46
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 >=0 && $net_mask <=7) return $octet = array("1", "0");
elseif($net_mask >=8 && $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>";
}
?>

Написал скрипт, есть подозрение, что алгоритм ошибочный в определении диапазона сети
 
Ошибочный.
  • Введение /25 маски выдаёт результат 255.255.255.0 (должно быть 255.128)
  • Введение /26 маски выдаёт результат 255.255.255.128 (должно быть 255.192)
  • Некорректный расчёт, если вводить сеть, начинающуюся не с .0, например 192.168.1.64/255.255.255.192 (26-я сетка).
Сильнее углубляться смысла не видел, скрипт довольно мрачный.
И зачем изобретать велосипед?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху