C++实现子网划分工具,并写出设计思路,能够计算出下列参数:子网数及有效子网、每个子网的主机数、每个子网IP范围及广播地址。
时间: 2024-03-22 12:42:58 浏览: 157
ip地址的合法性及子网判断(课程设计代码)
设计思路:
1. 输入IP地址和子网掩码,计算出网络号和主机号的分界点。
2. 根据子网掩码的位数,计算出可以划分的子网数。
3. 根据子网数,确定子网掩码的位数。
4. 根据子网掩码的位数,计算出每个子网的主机数。
5. 根据子网掩码的位数和网络号,计算出每个子网的网络地址和广播地址。
6. 根据每个子网的网络地址和主机数,计算出每个子网的IP地址范围。
C++代码:
```cpp
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
// 将 IP 地址字符串转换成整型
unsigned int IP_to_int(string ip) {
unsigned int result = 0;
string temp = "";
for (int i = 0; i < ip.size(); i++) {
if (ip[i] != '.') {
temp += ip[i];
}
else {
result = result << 8;
result += stoi(temp);
temp = "";
}
}
result = result << 8;
result += stoi(temp);
return result;
}
// 将整型转换成 IP 地址字符串
string int_to_IP(unsigned int ip) {
string result = "";
for (int i = 0; i < 4; i++) {
int temp = ip & 255;
ip = ip >> 8;
result = to_string(temp) + "." + result;
}
result.pop_back();
return result;
}
// 将子网掩码位数转换成整型
unsigned int mask_to_int(unsigned int mask) {
unsigned int result = 0;
for (int i = 0; i < mask; i++) {
result = result << 1;
result += 1;
}
for (int i = mask; i < 32; i++) {
result = result << 1;
}
return result;
}
// 计算子网数和有效子网
void calc_subnet(unsigned int ip, unsigned int mask, int& subnet_num, int& valid_subnet) {
subnet_num = pow(2, 32 - mask);
valid_subnet = subnet_num - 2;
}
// 计算每个子网的主机数
int calc_host(unsigned int mask) {
return pow(2, 32 - mask) - 2;
}
// 计算每个子网的网络地址和广播地址
void calc_addr(unsigned int ip, unsigned int mask, int subnet_id, unsigned int& subnet_addr, unsigned int& broadcast_addr) {
unsigned int mask_int = mask_to_int(mask);
subnet_addr = (ip & mask_int) + subnet_id * pow(2, 32 - mask);
broadcast_addr = subnet_addr + pow(2, 32 - mask) - 1;
}
// 计算每个子网的 IP 地址范围
void calc_range(unsigned int subnet_addr, int host_num, unsigned int& start_addr, unsigned int& end_addr) {
start_addr = subnet_addr + 1;
end_addr = subnet_addr + host_num;
}
int main() {
string ip_str, mask_str;
cout << "请输入IP地址和子网掩码,以空格分隔:" << endl;
cin >> ip_str >> mask_str;
unsigned int ip = IP_to_int(ip_str);
unsigned int mask = IP_to_int(mask_str);
int subnet_num, valid_subnet;
calc_subnet(ip, mask, subnet_num, valid_subnet);
cout << "子网数:" << subnet_num << endl;
cout << "有效子网:" << valid_subnet << endl;
int host_num = calc_host(mask);
cout << "每个子网的主机数:" << host_num << endl;
for (int i = 0; i < valid_subnet; i++) {
unsigned int subnet_addr, broadcast_addr, start_addr, end_addr;
calc_addr(ip, mask, i, subnet_addr, broadcast_addr);
calc_range(subnet_addr, host_num, start_addr, end_addr);
cout << "第" << i + 1 << "个子网:" << endl;
cout << "网络地址:" << int_to_IP(subnet_addr) << endl;
cout << "广播地址:" << int_to_IP(broadcast_addr) << endl;
cout << "IP地址范围:" << int_to_IP(start_addr) << " - " << int_to_IP(end_addr) << endl;
}
return 0;
}
```
在上述代码中,使用了一些辅助函数,如将 IP 地址字符串转换成整型、将整型转换成 IP 地址字符串、将子网掩码位数转换成整型等等。计算子网数和有效子网的函数为 `calc_subnet`,计算每个子网的主机数的函数为 `calc_host`,计算每个子网的网络地址和广播地址的函数为 `calc_addr`,计算每个子网的 IP 地址范围的函数为 `calc_range`。在主函数中,依次计算出子网数和有效子网、每个子网的主机数、每个子网的网络地址和广播地址、每个子网的 IP 地址范围,并输出结果。
阅读全文