BKK
Профессор
- Регистрация
- 21 Окт 2009
- Сообщения
- 157
- Реакции
- 46
- Автор темы
- #1
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>";
}
?>
Написал скрипт, есть подозрение, что алгоритм ошибочный в определении диапазона сети