我现在有点纠结于某件事:
尝试计算以下CIDR IP的网络/广播地址: 10.20.30.45/13。
据我所知,此IP的网络部分有13位长,这告诉我们在确定网络地址-> 10.X.0.0时,必须从第二个数字开始更改地址
但是X将是什么,我如何计算X呢?
发布于 2014-07-15 20:49:35
您可以将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为您自动执行此操作。
发布于 2014-08-14 19:12:25
在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.255https://stackoverflow.com/questions/24742860
复制相似问题