2022年第一篇博文,记录今晚实验课遇到的一个题(emmm当时没做出来现在emo了我好菜啊每天重复一次)。
题目描述:
给定一个IP地址与一个子网掩码,输出该网络号之下所有可用的IP地址
不要借助socket相关的API
运行结果:
奉上代码如下:
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
unsigned int getBinary(string value);
string convert(unsigned int addr);
int main(){
//输入一个子网掩码
string ipMask("255.255.255.192");
unsigned int mask = getBinary(ipMask);
//输入一个IP地址
string ipStr("192.168.152.193");
unsigned int ip = getBinary(ipStr);
//算出该网络中一共有多少个主机号
unsigned int count = mask ^ 0xffffffff;
count = count - 1; //减去广播地址
cout << "该网段下,共有:" << count << "个地址可用" << endl;
unsigned int ipStart = ip & mask;
unsigned int currentIp = 0;
for (unsigned int i = 1; i <= count; i++){
currentIp = ipStart + i;
//将十进制数转换为点分十进制IP地址
string avaIp = convert(currentIp);
cout << avaIp << endl;
}
system("pause");
return 0;
}
//将二进制IP地址转换为点分十进制字符串
string convert(unsigned int addr){
unsigned int s1 = unsigned char((addr & 0xff000000) >> 24);
unsigned int s2 = unsigned char((addr & 0x00ff0000) >> 16);
unsigned int s3 = unsigned char((addr & 0x0000ff00) >> 8);
unsigned int s4 = unsigned char((addr & 0x000000ff));
stringstream ss;
auto state = ss.rdstate();
ss << s1;
string ss1;
ss >> ss1;
ss.clear(state);
ss << s2;
string ss2;
ss >> ss2;
ss.clear(state);
ss << s3;
string ss3;
ss >> ss3;
ss.clear(state);
ss << s4;
string ss4;
ss >> ss4;
ss.clear(state);
string result = ss1 + "." + ss2 + "." + ss3 + "." +ss4;
//cout << result << endl;
return result;
}
//字符串地址转为二进制
unsigned int getBinary(string value){
unsigned int result =0;
unsigned char mask = 0;
string append;
for (int i =0; i < value.length(); i++){
if(value[i] == '.' || i == value.length() - 1){
if(i == value.length() - 1){
append += value[i];
}
mask = (unsigned char )atoi(append.c_str());
result = result | mask;
//不是最后一个字节时才左移
if(i != value.length() - 1){
result = result << 8; //左移一个字节
}
append = "";
}else{
append += value[i];
}
}
return result;
}
思路如下:
1、将字符串格式的IP地址、子网掩码转换为二进制数据,此处使用unsigned int 接收
2、子网掩码与 0xFFFFFFFF 异或运行 就可以算出这个网段下所有可用IP地址数量了,举个例子:
子网掩码 : 255.255.255.0
转换为二进制:1111 1111 1111 1111 1111 1111 0000 0000
0xFFFFFFFF => 1111 1111 1111 1111 1111 1111 1111 1111
异或运算之后: 0000 0000 .............................. 1111 1111
如此一来就算出了这个网络号之下所有可用的IP地址数量了,注意要减去 广播地址哈
3、将子网掩码与IP地址相与运行,就可以算出该网络号下开始的IP地址了
4、循环,起始IP地址 不断 +1 就是该网段下可用的IP地址,终止条件就是前面算出来的该网段下可用IP地址数量。
emmmm,其他细节自行把控即可。