编程知识 cdmana.com

Sortie de toutes les adresses IP disponibles sous un segment réseau | implémentation C + + | adresse IP en données binaires | adresse IP décimale en points de données binaires

2022Le premier billet de blog de l'année,Notez un problème que vous avez rencontré ce soir en classe expérimentale.(emmmJe ne l'ai pas fait.emoC'est bon, je le répète tous les jours.).

Description du sujet:

Compte tenu d'unIPAdresse et masque de sous - réseau,Exporter tous les éléments disponibles sous ce numéro de réseauIPAdresse

N'aide pas.socketQuestions connexesAPI

Résultats des opérations: 

Code ci - dessous:

#include <string>
#include <iostream>
#include <sstream>
using namespace std;

unsigned int getBinary(string value);
string convert(unsigned int addr);

int main(){
//Saisissez un masque de sous - réseau
 string ipMask("255.255.255.192");
 unsigned int mask = getBinary(ipMask);
//Entrez unIPAdresse
 string ipStr("192.168.152.193");
 unsigned int ip = getBinary(ipStr);

 // Calculez le nombre total d'hôtes dans ce réseau 
 unsigned int count = mask ^ 0xffffffff;
 count = count - 1; // Moins l'adresse de diffusion 
 cout << " Sous ce segment ,Total:" << count << " Adresses disponibles " << endl;

 unsigned int ipStart =  ip & mask;
 unsigned int currentIp = 0;
 for (unsigned int i = 1; i <= count; i++){
  currentIp = ipStart + i;
  // Convertir des nombres décimaux en décimales pointillées IPAdresse
  string avaIp = convert(currentIp);
  cout << avaIp << endl;
 }

 system("pause");
 return 0;
}

//BinaireIP Adresse convertie en chaîne décimale pointillée 
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;
}

// L'adresse de la chaîne est convertie en binaire 
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;
   // Déplacer à gauche quand ce n'est pas le dernier octet 
   if(i != value.length() - 1){
    result = result << 8; // Déplacer un octet à gauche    
   }
   append = "";
  }else{
   append += value[i];
  }
 }
 return result;
}

L'idée est la suivante::

1、Formatage des chaînesIPAdresse、 Masque de sous - réseau converti en données binaires ,Utiliser iciunsigned int  Réception

2、Masque de sous - réseau et 0xFFFFFFFF Xor Run Vous pouvez calculer tout ce qui est disponible sous ce segment IP Nombre d'adresses ,Par exemple,:

Masque de sous - réseau : 255.255.255.0

Convertir en binaire:1111 1111 1111 1111 1111 1111  0000 0000

0xFFFFFFFF => 1111 1111 1111 1111 1111 1111 1111 1111

Après l'opération Xor : 0000 0000 ..............................   1111 1111

Donc nous avons calculé tout ce qui est disponible sous ce numéro de réseau IP Nombre d'adresses , Attention à soustraire Adresse Radio

3、Masquer le Sous - réseau avecIP Phase d'adresse et exécution , Vous pouvez calculer ce qui commence sous ce numéro de réseau IPL'adresse est

4、Cycle,DébutIPAdresse Sans cesse. +1 Est disponible sous ce segment IPAdresse, La condition de terminaison est que le segment réseau précédemment calculé est disponible sous IPNombre d'adresses.

emmmm, D'autres détails peuvent être contrôlés par vous - même .

版权声明
本文为[Somafish]所创,转载请带上原文链接,感谢
https://cdmana.com/2022/01/202201080559336443.html

Scroll to Top