Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: "Liczenie podsieci"
Forum PHP.pl > Forum > PHP
akurczyk
Witam
Niewiem jak mam zacząć:(
Poczebuję skryptu, który podsiadająć dwie dane (adres ip i maskę podsieci), wyliczy adres pierwszego i ostatniego hosta w podsieci, adres podsieci i adres rozgłoszeniowy (ang. broadcast). Zupełnie niewiem jak mam zacząć...
Input:
  • Adres IP (ip_address) np. 122.77.188.37, 2992265511, 01010101 01010101 01010101 01010101 lub F2:10:89:20.
  • Maska podsieci (subnet_mask) np. 255.255.240.000, 3312656784, 11110101 01011111 01110111 11111110, D4:50:40:F4 lub /26.
Output:
  • Pierwszy host w podsieci w zapisie dziesiętno-kropkowym np. 177.188.166.22.
  • Pierwszy host w podzieci w zapisie dziesiętnym np. 3492247722.
  • Pierwszy host w podsieci w zapisie dwójkowym np. 10101010 10101010 10101010 10101010.
  • Pierwszy host w podsieci w zapisie szestnastkowym np. D0:50:98:02.
  • Ostatni host w podsieci w zapisie dziesiętno-kropkowym np. 177.188.166.22.
  • Ostatni host w podzieci w zapisie dziesiętnym np. 3492247722.
  • Ostatni host w podsieci w zapisie dwójkowym np. 10101010 10101010 10101010 10101010.
  • Ostatni host w podsieci w zapisie szestnastkowym np. D0:50:98:02.
  • Maska podsieci w zapisie dziesiętno-kropkowym np. 177.188.166.22.
  • Maska podsieci w zapisie dziesiętnym np. 3492247722.
  • Maska podsieci w zapisie dwójkowym np. 10101010 10101010 10101010 10101010.
  • Maska podsieci w zapisie szestnastkowym np. D0:50:98:02.
  • Liczba bajtów części sieci w adresie IP np. /27.
  • Adres podsieci w zapisie dziesiętno-kropkowym np. 177.188.166.22.
  • Adres podsieci w zapisie dziesiętnym np. 3492247722.
  • Adres podsieci w zapisie dwójkowym np. 10101010 10101010 10101010 10101010.
  • Adres podsieci w zapisie szestnastkowym np. D0:50:98:02.
  • Adres rozgłoszeniowy (ang. broadcast) w zapisie dziesiętno-kropkowym np. 177.188.166.22.
  • Adres rozgłoszeniowy (ang. broadcast) w zapisie dziesiętnym np. 3492247722.
  • Adres rozgłoszeniowy (ang. broadcast) w zapisie dwójkowym np. 10101010 10101010 10101010 10101010.
  • Adres rozgłoszeniowy (ang. broadcast) w zapisie szestnastkowym np. D0:50:98:02.
To co do tej pory napisałem, czyli nic bo niewiem jak zacząć:(
Kod
<html>
<head>
<title>NetTools</title>
</head>
<body>
<form method="post">
<table>
<tr>
<td>IP Address:</td>
<td><input type="text" name="ip_address"></td>
</tr>
<tr>
<td>Subnet mask:</td>
<td><input type="text" name="subnet_mask"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"></td>
</tr>
</table>
<?php
?>
</form>
</body>
</html>

Pomocy!!!
kajzur
Żeby takie rzeczy wyliczać, warto podane adresy przeliczyć na ich binarną wartość.. Jak się przelicza (swoisty algorytm) znajdziesz chyba w wikipedii, poczytaj też o operacjach and, or, i negacji..
akurczyk
Mógłbyś mi powiedzieć lub dać linki do manuala (odpowiednie funkcje):
  • Jak sprawdzić czy dana wartosć jest w zapisie dziesiętnym, dziesiętnym (z kropkami), dwójkowym, szestnastkowym, czy jest liczbą dajtów (do 32) po sleshu??
  • Jak przekonwertować wartość z zapisu dziesiętnego, dziesiętno-kropkowanego, swójkowego, szestnastkowego, czy liczby bajtów po sleshu na wartość w zapisie dwójkowym??
  • Jak przekonwertować to z powrotem??
  • Jak obliczyć adres pierwszego hosta w podsieci (w zapisei dwójkowym)questionmark.gif
  • Jak obliczyć adres ostatniego hosta w podsieci (-||-)questionmark.gif
  • Jak obliczyć adres podsieci (-||-)questionmark.gif
  • Jak obliczyć adres rozgłoszeniowy (ang. broadcast) (również w zapisie dwójkowym)questionmark.gif
HELP_ME!!!
akurczyk
Wielkie dzięki:)
edit: A jak zamienić liczbę dziesiętną z kropkami na binarną?questionmark.gif
erix
explode" title="Zobacz w manualu PHP" target="_manual. Chyba nie chcesz wszystkich oktetów sumować i wtedy tworzyć z tego liczby. tongue.gif Ale jeśli tak, to str_replace" title="Zobacz w manualu PHP" target="_manual, wyrzucasz tym kropki i rzutujesz zmienną na INT, potem z górki.
artega
  1. <?php echo decbin(ip2long('127.0.0.1')); ?>

Takie rozwiązanie wydaje się być bardziej "eleganckie" winksmiley.jpg
akurczyk
Jak zamienić wartość binarną na CIDR (czyli ilość jedynek w zmiennej)questionmark.gif?
Skrypt w akcji: http://kklodzka.pdg.pl/konwersja.php
Kod
<html>
<head>
<title>NetTools</title>
</head>
<body>
<form method="post">
<table>
<tr>
<td align="right">IP address:</td>
<td><input type="text" name="ip_address" value="<?php echo $_POST["ip_address"];?>"></td>
</tr>
<tr>
<td align="right">Type:</td>
<td>
<select name="ip_address_type">
<option>IP</option>
<option>DEC</option>
<option>BIN</option>
</select>
</td>
</tr>
<tr>
<td align="right">Subnet mask:</td>
<td><input type="text" name="subnet_mask" value="<?php echo $_POST["subnet_mask"];?>"></td>
</tr>
<tr>
<td align="right">Type:</td>
<td>
<select name="subnet_mask_type">
<option>IP</option>
<option>CIDR</option>
<?php
//<option>DEC</option>
//<option>BIN</option>
?>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"></td>
</tr>
</table>
<?php
if($_POST["ip_address_type"]=="IP"):
$ip_address=ip2long($_POST["ip_address"]);
$ip_address=decbin($ip_address);
elseif($_POST["ip_address_type"]=="DEC"):
$ip_address=decbin($_POST["ip_address"]);
elseif($_POST["ip_address_type"]=="BIN"):
$ip_address=$_POST["ip_address_type"];
endif;

if($_POST["subnet_mask_type"]=="IP"):
$subnet_mask=ip2long($_POST["subnet_mask"]);
$subnet_mask=decbin($subnet_mask);
//Jak zamienić wartość binarną na CIDR (czyli ilość jedynek w zmiennej)?questionmark.gif
elseif($_POST["subnet_mask_type"]=="CIDR"):
$subnet_mask=$_POST["subnet_mask"];
endif;

$ip_address=substr($ip_address,0,$subnet_mask);

$subnet_mask=32-$_POST["subnet_mask"];

$subnet_address=$ip_address;
for($i=0;$i<$subnet_mask;$i++):
$subnet_address=$subnet_address."0";
endfor;
$subnet_address=bindec($subnet_address);
$subnet_address=long2ip($subnet_address);

$first_host=$ip_address;
for($i=0;$i<$subnet_mask;$i++):
if($i!==$subnet_mask-1):
$first_host=$first_host."0";
else:
$first_host=$first_host."1";
endif;
endfor;
$first_host=bindec($first_host);
$first_host=long2ip($first_host);

$last_host=$ip_address;
for($i=0;$i<$subnet_mask;$i++):
if($i!==$subnet_mask-1):
$last_host=$last_host."1";
else:
$last_host=$last_host."0";
endif;
endfor;
$last_host=bindec($last_host);
$last_host=long2ip($last_host);

$broadcast=$ip_address;
for($i=0;$i<$subnet_mask;$i++):
$broadcast=$broadcast."1";
endfor;
$broadcast=bindec($broadcast);
$broadcast=long2ip($broadcast);
?>
<table>
<tr>
<td align="right">Subnet address:</td>
<td><?php echo $subnet_address;?></td>
</tr>
<tr>
<td align="right">First host:</td>
<td><?php echo $first_host;?></td>
</tr>
<tr>
<td align="right">Last host:</td>
<td><?php echo $last_host;?></td>
</tr>
<tr>
<td align="right">Broadcast:</td>
<td><?php echo $broadcast;?></td>
</tr>
</table>
</form>
</body>
</html>

POMOCY_!!!
#luq
Zrób sobie tablicę:
  1. <?php
  2. $cidrArr = array(
  3.        '255.255.255.255' => '/32',
  4.        '255.255.255.254' => '/31'
  5.        /*[...]*/
  6.    );
  7. ?>

A potem tylko:
  1. <?php
  2. $cidr = $cidrArr[ $stringMaski ];
  3. ?>

Chyba, że to się jakoś przelicza, bo na tym się nie znam niestety.
akurczyk
Racja, zrobię tablicę ale w wersji dwójkowej. Thx

Mam problem:( Niedziała przyjmowanie adresu IP w postaci dziesiętnej:( Zamiana w odwrotną stronę działa, bo wszystko wyliczane jest na podstawie zapisu dziesiętnego adresu IP. Gdy podaję poprawny adres IP, skrypt zwraca maksymalne wartośći wszystkich zapisów.
Zrobiłem tak:
Kod
<html>
<head>
<title>Narzędzia sieciowe</title>
</head>
<body>
<form method="post">
<table>
<tr>
<td align="right">Adres IP:</td>
<td><input type="text" name="adres_ip" value="<?=$_POST["adres_ip"];?>"></td>
</tr>
<tr>
<td align="right">Zapis:</td>
<td>
<select name="zapis_adresu_ip">
<option value="2">Dwójkowy</option>
<option value="8">Ósemkowy</option>
<option value="10">Dziesiętny</option>
<option value="11">Kropkowo-dziesiętny</option>
<option value="16">Szestnastkowy</option>
</select>
</td>
</tr>
<tr>
<td align="right">Maska podsieci:</td>
<td>
<select name="maska_podsieci">
<?php
//<option value="32">255.255.255.255/32</option>
//<option value="31">255.255.255.254/31</option>
?>
<option value="30">255.255.255.252/30</option>
<option value="29">255.255.255.248/29</option>
<option value="28">255.255.255.240/28</option>
<option value="27">255.255.255.224/27</option>
<option value="26">255.255.255.192/26</option>
<option value="25">255.255.255.128/25</option>
<option value="24">255.255.255.0/24(C)</option>
<option value="23">255.255.254.0/23</option>
<option value="22">255.255.252.0/22</option>
<option value="21">255.255.248.0/21</option>
<option value="20">255.255.240.0/20</option>
<option value="19">255.255.224.0/19</option>
<option value="18">255.255.192.0/18</option>
<option value="17">255.255.128.0/17</option>
<option value="16">255.255.0.0/16(B)</option>
<option value="15">255.255.0.0/15</option>
<option value="14">255.255.0.0/14</option>
<option value="13">255.255.0.0/13</option>
<option value="12">255.255.0.0/12</option>
<option value="11">255.255.0.0/11</option>
<option value="10">255.255.0.0/10</option>
<option value="9">255.255.0.0/9</option>
<option value="8">255.0.0.0/8(A)</option>
<option value="7">254.0.0.0/7</option>
<option value="6">252.0.0.0/6</option>
<option value="5">248.0.0.0/5</option>
<option value="4">240.0.0.0/4</option>
<option value="3">224.0.0.0/3</option>
<option value="2">192.0.0.0/2</option>
<option value="1">128.0.0.0/1</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Wyślij"></td>
</tr>
</table>
<?php
if($_POST["zapis_adresu_ip"]=="2"):
$adres_ip=$_POST["adres_ip"];
elseif($_POST["zapis_adresu_ip"]=="8"):
$adres_ip=octdec($_POST["adres_ip"]);
$adres_ip=decbin($adres_ip);
elseif($_POST["zapis_adresu_ip"]=="10"):
$adres_ip=decbin($_POST["adres_ip"]);
elseif($_POST["zapis_adresu_ip"]=="11"):
$adres_ip=ip2long($_POST["adres_ip"]);
$adres_ip=decbin($adres_ip);
elseif($_POST["zapis_adresu_ip"]=="16"):
$adres_ip=hexdec($_POST["adres_ip"]);
$adres_ip=decbin($adres_ip);
endif;
$adres_ip=substr($adres_ip,0,$_POST["maska_podsieci"]);

$adres_podsieci_dwojkowo=$adres_ip;
for($i=1;$i<=32-$_POST["maska_podsieci"];$i++):
$adres_podsieci_dwojkowo=$adres_podsieci_dwojkowo."0";
endfor;
$adres_podsieci_dziesietnie=bindec($adres_podsieci_dwojkowo);
$adres_podsieci_kropkowo_dziesietnie=long2ip($adres_podsieci_dziesietnie);
$adres_podsieci_osemkowo=decoct($adres_podsieci_dziesietnie);
$adres_podsieci_szestnastkowo=dechex($adres_podsieci_dziesietnie);

$pierwszy_host_dwojkowo=$adres_ip;
for($i=1;$i<=32-$_POST["maska_podsieci"];$i++):
if($i!==32-$_POST["maska_podsieci"]):
$pierwszy_host_dwojkowo=$pierwszy_host_dwojkowo."0";
else:
$pierwszy_host_dwojkowo=$pierwszy_host_dwojkowo."1";
endif;
endfor;
$pierwszy_host_dziesietnie=bindec($pierwszy_host_dwojkowo);
$pierwszy_host_kropkowo_dziesietnie=long2ip($pierwszy_host_dziesietnie);
$pierwszy_host_osemkowo=decoct($pierwszy_host_dziesietnie);
$pierwszy_host_szestnastkowo=dechex($pierwszy_host_dziesietnie);

$ostatni_host_dwojkowo=$adres_ip;
for($i=1;$i<=32-$_POST["maska_podsieci"];$i++):
if($i!==32-$_POST["maska_podsieci"]):
$ostatni_host_dwojkowo=$ostatni_host_dwojkowo."1";
else:
$ostatni_host_dwojkowo=$ostatni_host_dwojkowo."0";
endif;
endfor;
$ostatni_host_dziesietnie=bindec($ostatni_host_dwojkowo);
$ostatni_host_kropkowo_dziesietnie=long2ip($ostatni_host_dziesietnie);
$ostatni_host_osemkowo=decoct($ostatni_host_dziesietnie);
$ostatni_host_szestnastkowo=dechex($ostatni_host_dziesietnie);

$adres_rozgloszeniowy_dwojkowo=$adres_ip;
for($i=1;$i<=32-$_POST["maska_podsieci"];$i++):
$adres_rozgloszeniowy_dwojkowo=$adres_rozgloszeniowy_dwojkowo."1";
endfor;
$adres_rozgloszeniowy_dziesietnie=bindec($adres_rozgloszeniowy_dwojkowo);
$adres_rozgloszeniowy_kropkowo_dziesietnie=long2ip($adres_rozgloszeniowy_dziesietnie);
$adres_rozgloszeniowy_osemkowo=decoct($adres_rozgloszeniowy_dziesietnie);
$adres_rozgloszeniowy_szestnastkowo=dechex($adres_rozgloszeniowy_dziesietnie);
?>
<br>
<table>
<tr>
<td align="right">Adres podsieci (Dwójkowo):</td>
<td><?=$adres_podsieci_dwojkowo;?></td>
</tr>
<tr>
<td align="right">Adres podsieci (Ósemkowo):</td>
<td><?=$adres_podsieci_osemkowo;?></td>
</tr>
<tr>
<td align="right">Adres podsieci (Dziesiętnie):</td>
<td><?=$adres_podsieci_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Adres podsieci (Kropkowo-dziesiętnie):</td>
<td><?=$adres_podsieci_kropkowo_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Adres podsieci (Szestnastkowo):</td>
<td><?=$adres_podsieci_szestnastkowo;?></td>
</tr>
<tr></tr>
<tr>
<td align="right">Pierwszy host (Dwójkowo):</td>
<td><?=$pierwszy_host_dwojkowo;?></td>
</tr>
<tr>
<td align="right">Pierwszy host (Ósemkowo):</td>
<td><?=$pierwszy_host_osemkowo;?></td>
</tr>
<tr>
<td align="right">Pierwszy host (Dziesiętnie):</td>
<td><?=$pierwszy_host_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Pierwszy host (Kropkowo-dziesiętnie):</td>
<td><?=$pierwszy_host_kropkowo_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Pierwszy host (Szestnastkowo):</td>
<td><?=$pierwszy_host_szestnastkowo;?></td>
</tr>
<tr></tr>
<tr>
<td align="right">Ostatni host (Dwójkowo):</td>
<td><?=$ostatni_host_dwojkowo;?></td>
</tr>
<tr>
<td align="right">Ostatni host (Ósenkowo):</td>
<td><?=$ostatni_host_osemkowo;?></td>
</tr>
<tr>
<td align="right">Ostatni host (Dziesiętnie):</td>
<td><?=$ostatni_host_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Ostatni host (Kropkowo-dziesiętnie):</td>
<td><?=$ostatni_host_kropkowo_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Ostatni host (Szestnastkowo):</td>
<td><?=$ostatni_host_szestnastkowo;?></td>
</tr>
<tr></tr>
<tr>
<td align="right">Zakres hostów:</td>
<td><?=$ostatni_host_dziesietnie-$adres_podsieci_dziesietnie;?></td>
</tr>
<tr></tr>
<tr>
<td align="right">Adres rozgłoszeniowy (Dwójkowo):</td>
<td><?=$adres_rozgloszeniowy_dwojkowo;?></td>
</tr>
<tr>
<td align="right">Adres rozgłoszeniowy (Ósemkowo):</td>
<td><?=$adres_rozgloszeniowy_osemkowo;?></td>
</tr>
<tr>
<td align="right">Adres rozgłoszeniowy (Dziesiętnie):</td>
<td><?=$adres_rozgloszeniowy_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Adres rozgłoszeniowy (Kropkowo-dziesiętnie):</td>
<td><?=$adres_rozgloszeniowy_kropkowo_dziesietnie;?></td>
</tr>
<tr>
<td align="right">Adres rozgłoszeniowy (Szestnastkowo):</td>
<td><?=$adres_rozgloszeniowy_szestnastkowo;?></td>
</tr>
</table>
<br>
Created by Aleksander Kurczyk (codemaster2222(at)gmail(dot)com). All rights reserved.
</body>
</html>
<?=bindec(decbin("3232264041"));?>

Ostatnia linijka skryptu również nie działa:( tzn. zwraca maksymalną wartość (w zapisie dwójkowym czydzieści-dwie jedynki)...
HELP
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.