Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
所有IP';子网中的s(C)_C_Networking_Cidr_Netmask - Fatal编程技术网

所有IP';子网中的s(C)

所有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

有没有人能举一个很好的例子,说明我可以用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首先,将您的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));