输出一个网段下所有可用的IP地址|C++实现|IP地址转二进制数据|二进制数据转点分十进制IP地址

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,其他细节自行把控即可。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值