2014-12-27 82 views
1

所以下面的代碼是由另一個用戶發佈的。如何獲取子網中的每個IP地址?

我想知道什麼最好的方式來獲得"net['firstip']net['lastip']"之間的每個IP地址是?

我試着從十進制轉換爲二進制的幾種方式,但它不工作。我的想法是for()增加二進制firstip,直到它達到lastip,並將每個步驟轉換爲一個十進制等效值放入一個新的數組。

所有幫助表示讚賞。我試圖找到兩個IP之間的兩個特定部分。

function zerofill($val,$len,$reverse = false){ 
    while(strlen($val)<$len) 
     if($reverse) 
      $val .= "0"; 
     else 
      $val = "0".$val; 
    return $val; 

} 


function hextoip($hex){ 
    for($i=0;$i<4;$i++) 
     @$ip .= base_convert(substr($hex,$i*2,2),16,10)."."; 
    $ip = substr($ip,0,-1); 
    return $ip; 
} 



function iptohex($ip){ 
    $iparr = explode(".",$ip); 
    foreach($iparr as $i => $group){ 
     @$hex .= zerofill(base_convert($group,10,16),2); 
    } 
    return $hex; 
} 



function hextobin($hex){ 
    $bin = zerofill(base_convert($hex,16,2),32); 
    return $bin; 
} 



function bintohex($bin) { 
    $hex = zerofill(base_convert($bin,2,16),8); 
    return $hex; 
} 



function getnet($ip, $netmask){ 
    $iphex = iptohex($ip); 
    $netbin = hextobin($iphex); 
    $maskhex = iptohex($netmask); 
    $maskbin = hextobin($maskhex); 

    $hostbits = substr($maskbin,strpos($maskbin,"0")); 
    $netbits = substr($maskbin,0,strpos($maskbin,"0")); 
    $nethex = bintohex(zerofill(substr($netbin,0,strlen($netbits)),32,true)); 

    $hosts = pow(2,strlen($hostbits)); 
    $available_hosts = $hosts-3; 

    $net["ip"] = $ip; 
    $net["mask"] = $netmask; 
    $net["network"] = hextoip($nethex); 
    $net["netstr"] = $net["network"]."/".strlen($netbits); 
    $net["hosts"] = $available_hosts; 
    *** $net["firstip"] = hextoip(zerofill(base_convert(base_convert($nethex,16,10)+1,10,16),8));; 
    *** $net["lastip"] = hextoip(zerofill(base_convert(base_convert($nethex,16,10)+$available_hosts+1,10,16),8)); 
    $net["broadcast"] = hextoip(zerofill(base_convert(base_convert($nethex,16,10)+$available_hosts+2,10,16),8)); 
    return $net; 
} ` 

回答

1

您可以使用下面的代碼從第一個全IP地址到最後一個IP:

<?php 

function getIpRange( $cidr) { 

    list($ip, $mask) = explode('/', $cidr); 

    $maskBinStr =str_repeat("1", $mask) . str_repeat("0", 32-$mask);  //net mask binary string 
    $inverseMaskBinStr = str_repeat("0", $mask) . str_repeat("1", 32-$mask); //inverse mask 

    $ipLong = ip2long($ip); 
    $ipMaskLong = bindec($maskBinStr); 
    $inverseIpMaskLong = bindec($inverseMaskBinStr); 
    $netWork = $ipLong & $ipMaskLong; 

    $start = $netWork+1;//ignore network ID(eg: 192.168.1.0) 

    $end = ($netWork | $inverseIpMaskLong) -1 ; //ignore brocast IP(eg: 192.168.1.255) 
    return array('firstIP' => $start, 'lastIP' => $end); 
} 

function getEachIpInRange ($cidr) { 
    $ips = array(); 
    $range = getIpRange($cidr); 
    for ($ip = $range['firstIP']; $ip <= $range['lastIP']; $ip++) { 
     $ips[] = long2ip($ip); 
    } 
    return $ips; 
} 

$cidr = '172.16.0.0/27'; // max. 30 ips 
print_r(getEachIpInRange ($cidr)); 

/* output: 
Array                 
(                  
    [0] => 172.16.0.1             
    [1] => 172.16.0.2 
    [2] => 172.16.0.3 
    ... 
    [27] => 172.16.0.28            
    [28] => 172.16.0.29            
    [29] => 172.16.0.30 
) 
*/ 

如果你需要更多的相關信息看看到PHP手冊這裏:http://php.net/manual/de/function.ip2long.php
一些我的示例代碼中的部分來自本手冊。