CIDR地址计算(网络和广播地址)

时间:2014-07-14 18:01:55

标签: cidr

我现在有点困惑:

试图弄清楚如何计算以下CIDR IP的网络/广播地址:10.20.30.45/13。

据我所知,这个IP的网络部分是13位大的事实告诉我们,在确定网络地址时,必须从第二个oktett开始更改地址      - > 10.X.0.0

但X会是什么,我该如何计算X?

2 个答案:

答案 0 :(得分:2)

您可以将10.20.30.45转换为二进制,将/ 13转换为二进制,即255.248.0.0。

二进制的

10.20.30.45 将是00001010 00010100 00011110 00101101 255.248.0.0 是11111111 11111000 00000000 00000000

然后比较它们:

00001010 00010100 00011110 00101101
11111111 11111000 00000000 00000000
______________________________________
00001010 00010000 00000000 00000000 => back to decimal is 10.16.0.0

要获取广播地址,您必须对CIDR或网络掩码地址进行二进制反转。

或者你可以CIDR converter为你自动化它。

答案 1 :(得分:0)

在C(++)中:

#ifdef __FreeBSD__
#include <sys/socket.h>
#endif
#include <arpa/inet.h>
#include <netinet/in.h>

#include <cassert>
#include <cstdint>
#include <iostream>

int main() {
  in_addr net, broadcast;
  int bits = inet_net_pton(AF_INET, "10.20.30.45/13", &net, sizeof(net));
  assert((bits != -1));  // assert that inet_net_pton understood us
  // Apply CIDR mask to address to get the network
  if (bits > 0) {  // u32 << 32 is undefined
    uint32_t mask = htonl((0xFFFFFFFFu) << (32 - bits));
    net.s_addr &= mask;
  }
  broadcast = net;
  // Do the same for broadcast
  if (bits < 32) {
    uint32_t mask = htonl((0xFFFFFFFFu) >> bits);
    broadcast.s_addr |= mask;
  }
  std::cout << "Network: " << inet_ntoa(net) << std::endl;
  std::cout << "Broadcast: " << inet_ntoa(broadcast) << std::endl;
}

输出:

Network: 10.16.0.0
Broadcast: 10.23.255.255