2013-03-20 93 views
0

這裏例如是一個ISP分配的IP範圍。PHP從IP範圍生成IP列表

91.105.0.0/17 
46.109.0.0/16 
194.8.16.0/21 
194.8.24.0/22 
194.8.40.0/23 
194.8.43.0/24 
195.122.0.0/19 
195.13.128.0/17 
80.232.128.0/17 
81.198.0.0/16 
84.237.128.0/17 
87.110.0.0/16 
194.8.9.0/24 
194.8.12.0/23 
195.114.32.0/19 
195.2.96.0/19 
62.85.0.0/17 
87.246.144.0/20 
87.246.160.0/19 
78.84.0.0/16 
193.200.224.0/24 
95.68.0.0/17 

如果我是正確的,對於這種範圍193.200.224.0/24有IP的 從 193.200.224.1 到 193.200.224.255

和87.110.0.0/16 從 87.110。 1.1 至 87.110.255.255

但是如何計算0/17,0/19,如何計算這些?

我需要幫助寫PHP函數來自動生成所有IP的

我會把所有範圍數據庫然後運行PHP腳本,併爲每個範圍的IP列表。

所有這一切的目的?我希望我的國家所有的ip adreses,所以我可以更多地分析我的網站訪問者。

thanx

+0

你應該看看ip2long手冊頁上的一些評論,他們中的許多人處理與你類似的情況,並且他們都不需要生成完整的ip表 - > http://php.net/manual /en/function.ip2long.php – Crisp 2013-03-20 11:12:39

+0

我會看看它,thanx – Edmhs 2013-03-20 11:16:00

回答

1

對於193.200.224.0/24,ip地址範圍從193.200.224.0到193.200.224.255。這是256個IP地址的範圍 - 2 ^(32-24)= 2^8 = 256

對於91.105.0.0/17,它是相同的計算 - 2 ^(32-17)= 2^15 = 32768 ip地址從91.105.0.0開始。

您可以使用某種嵌套循環來生成範圍內的所有IP地址。

+0

什麼是32號?在2 ^(32-17)?? – Edmhs 2013-03-20 11:57:16

+0

ip地址是一個32位數字 – cakan 2013-03-20 12:09:24

5

這就是我想出了:

$range = "194.8.42.0/24"; 
function ipListFromRange($range){ 
    $parts = explode('/',$range); 
    $exponent = 32-$parts[1].'-'; 
    $count = pow(2,$exponent); 
    $start = ip2long($parts[0]); 
    $end = $start+$count; 
    return array_map('long2ip', range($start, $end)); 
} 

返回陣列的所有IP addreses 在我的情況,我用這個來從180 ISP的200萬個IP addreses。