我想在IP地址范围内执行一组网络任务。一旦范围变得比c类网络大,我就无法枚举该范围内的所有主机。
我希望能够使用网络掩码255.255.240.0
遍历网络的所有主机。
From: 192.168.0.100 To: 192.168.10.100
如何接近这个?这一定是一项非常普遍的任务。我来自Cocoa iPhone编程的绿色领域,所以我们将欣赏C时尚的解决方案。 : - )
答案 0 :(得分:7)
这是一段代码,可以快速向您介绍解释IP地址和迭代它所涉及的细微差别。
一旦开始将IP地址视为32位无符号整数,事情变得非常简单。
#include <stdio.h>
int
main (int argc, char *argv[])
{
unsigned int iterator;
int ipStart[]={192,168,0,100};
int ipEnd[] = {192,168,10,100};
unsigned int startIP= (
ipStart[0] << 24 |
ipStart[1] << 16 |
ipStart[2] << 8 |
ipStart[3]);
unsigned int endIP= (
ipEnd[0] << 24 |
ipEnd[1] << 16 |
ipEnd[2] << 8 |
ipEnd[3]);
for (iterator=startIP; iterator < endIP; iterator++)
{
printf (" %d.%d.%d.%d\n",
(iterator & 0xFF000000)>>24,
(iterator & 0x00FF0000)>>16,
(iterator & 0x0000FF00)>>8,
(iterator & 0x000000FF)
);
}
return 0;
}
只需检查ipStart
和ipEnd
的所有元素是否都大于255
这不会是一个IP地址,它也会破坏代码。
答案 1 :(得分:1)
这是一个PHP解决方案:
<?php
$sIP1 = '192.168.0.0';
$sIP2 = '192.168.1.255';
$aIPList = array();
if ((ip2long($sIP1) !== -1) && (ip2long($sIP2) !== -1)) // As of PHP5, -1 => False
{
for ($lIP = ip2long($sIP1) ; $lIP <= ip2long($sIP2) ; $lIP++)
{
$aIPList[] = long2ip($lIP);
}
}
?>
对所涉及的(基本)数学有一个很好的总结here
答案 2 :(得分:1)
使用模数运算符%
。这是一个原始的例子:
#include <stdio.h>
int main(void) {
int counter;
unsigned int ip[] = { 192, 168, 0, 0 };
for ( counter = 0; counter < 1000; ++counter ) {
ip[3] = ( ++ ip[3] % 256 );
if ( !ip[3] ) {
ip[2] = ( ++ ip[2] % 256 );
}
printf("%u:%u:%u:%u\n", ip[0], ip[1], ip[2], ip[3]);
}
return 0;
}