我现在有点困惑:
试图弄清楚如何计算以下CIDR IP的网络/广播地址:10.20.30.45/13。
据我所知,这个IP的网络部分是13位大的事实告诉我们,在确定网络地址时,必须从第二个oktett开始更改地址 - > 10.X.0.0
但X会是什么,我该如何计算X?
答案 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