所有IP';子网中的s(C)
有没有人能举一个很好的例子,说明我可以用CIDR获取IP地址,比如所有IP';子网中的s(C),c,networking,cidr,netmask,C,Networking,Cidr,Netmask,有没有人能举一个很好的例子,说明我可以用CIDR获取IP地址,比如192.168.1.1/24,然后返回该范围内的所有IP地址,比如192.168.1.1、192.168.1.2、192.168.1.3… 我可以用无符号long、char或类似的数组返回它 /* Pseudocode */ while(currnetip <= finalip) { print(currnetip); currnetip++; } /*伪代码*/ 而(currentip首先,将您的I
192.168.1.1/24
,然后返回该范围内的所有IP地址,比如192.168.1.1、192.168.1.2、192.168.1.3…
我可以用无符号long
、char
或类似的数组返回它
/* Pseudocode */
while(currnetip <= finalip) {
print(currnetip);
currnetip++;
}
/*伪代码*/
而(currentip首先,将您的IPv4地址打包到一个uint32\u t
(在
中定义)中,将点十进制表示法中最左边的八位字节放入最有意义的位。例如
uint32_t ipv4_pack(const uint8_t octet1,
const uint8_t octet2,
const uint8_t octet3,
const uint8_t octet4)
{
return (((uint32_t)octet1) << 24)
| (((uint32_t)octet2) << 16)
| (((uint32_t)octet3) << 8)
| ((uint32_t)octet4);
}
类似于128.64.32.16
的地址被打包到0x80402010
(128==8016、64==4016、32==2016和16==1016)
您还需要将前缀大小(1到32)转换为具有这么多最高位集的二进制掩码:
uint32_t ipv4_mask(const int prefix_size)
{
if (prefix_size > 31)
return (uint32_t)0xFFFFFFFFU;
else
if (prefix_size > 0)
return ((uint32_t)0xFFFFFFFFU) << (32 - prefix_size);
else
return (uint32_t)0U;
}
最后一个地址(通常是所述范围的广播地址)为
在所有情况下,first首先,将您的IPv4地址打包到一个uint32\t
(在
中定义)中,将点十进制表示法中最左边的八位字节放入最有意义的位。例如
uint32_t ipv4_pack(const uint8_t octet1,
const uint8_t octet2,
const uint8_t octet3,
const uint8_t octet4)
{
return (((uint32_t)octet1) << 24)
| (((uint32_t)octet2) << 16)
| (((uint32_t)octet3) << 8)
| ((uint32_t)octet4);
}
类似于128.64.32.16
的地址被打包到0x80402010
(128==8016、64==4016、32==2016和16==1016)
您还需要将前缀大小(1到32)转换为具有这么多最高位集的二进制掩码:
uint32_t ipv4_mask(const int prefix_size)
{
if (prefix_size > 31)
return (uint32_t)0xFFFFFFFFU;
else
if (prefix_size > 0)
return ((uint32_t)0xFFFFFFFFU) << (32 - prefix_size);
else
return (uint32_t)0U;
}
最后一个地址(通常是所述范围的广播地址)为
在所有情况下,首先,当前只有两个IP:IPv4和IPv6。我想你指的是IP地址,而不是IP(互联网协议)。@Ron Maupin是的,这就是我的意思。为澄清而编辑当前只有两个IP:IPv4和IPv6。我想你指的是IP地址,而不是IP(互联网协议).@Ron Maupin是的,这就是我的意思。为了清晰起见进行了编辑
uint32_t last = ipv4_pack(addr1, addr2, addr3, addr4) | (~ipv4_mask(prefix));