Programa para encontrar direcciones de Clase, Difusión y Red

Requisito previo: Introducción y direccionamiento con clase , direccionamiento sin 
clase Dada una dirección IPv4 válida en forma de string. La tarea es determinar la clase de la dirección IPv4 dada, así como separar las partes de ID de red y de host de la misma.
Dirección IPv4: 
cada host y enrutador en Internet tiene una dirección IP que codifica su número de red y número de host, una combinación de los dos es única. Una dirección IP en realidad no se refiere a un host sino a una interfaz de red, por lo que si el host está en dos redes, debe tener dos direcciones IP.
Máscara predeterminada: 
Una máscara de dirección determina qué parte de una dirección IP representa el número de red y qué parte representa el número de host, por ejemplo, la dirección IP, la máscara tiene cuatro octetos. Si un bit dado de la máscara es 1, el bit correspondiente de la dirección IP es la parte de la red y si el bit dado de la máscara es 0, el bit correspondiente de la dirección IP está en la parte del host.
 

CIDR: 
el enrutamiento entre dominios sin clase utiliza la notación de barra inclinada (/) para especificar la máscara con la dirección IPv4. La dirección se proporciona como xyzt/n, donde xyzt es la dirección IP y n es el número de 1 en la máscara predeterminada.
Dirección de red: 
la primera dirección de una red es una dirección de red. Se obtiene haciendo ANDing a la máscara con la dirección IP (Ambos en forma binaria). Otro método consiste en establecer los últimos 32 n bits de la dirección IP en 0.
Dirección de difusión: 
la última dirección de una red es una dirección de difusión. Se obtiene haciendo ORing a la máscara de complemento con la dirección IP (Ambos en forma binaria). Otro método es establecer los últimos 32 n bits de la dirección IP en 1.
Clase: 
La clase de una dirección se identifica por el primer byte de la dirección. Actualmente hay cinco clases A, B, C, D y E. El rango del primer byte de cada clase es: 

Class A: 0 - 127
Class B: 128 - 191
Class C: 192 - 223
Class D: 224 - 239
Class E: 240 - 255 

Ejemplo 1: 

CIDR: 192.168.32.1/24(x.y.z.t/n)
IP Address(Binary):  11000000101010000010000000000001
Default Mask(Binary):  11111111111111111111111100000000
Default Mask: 255.255.255.0

32-n=32-24=8  

First Address: Set last 8 bits of IP address to 0
              = 11000000101010000010000000000000
              = 192.168.32.0

Last Address: Set last 8 bits of IP address to 1
              = 11000000101010000010000011111111
              = 192.168.32.255  

Ejemplo-2: 

CIDR: 205.15.37.39/28(x.y.z.t/n)
IP Address(Binary):  11001101000011110010010100100111
Default Mask(Binary):  11111111111111111111111111110000
Default Mask: 255.255.255.240

32-n=32-28=4  

First Address: Set last 4 bits of IP address to 0
              = 11001101000011110010010100100000
              = 205.15.37.32

Last Address: Set last 4 bits of IP address to 1
              = 11001101000011110010010100101111
              = 205.15.37.47 

Implementación: 
el siguiente código utiliza los conceptos mencionados anteriormente:

C++

#include <iostream>
#include <string.h>
#include <stack>
#include <vector>
#include <math.h>
 
using namespace std;
    // Converts IP address to the binary form
vector<int> bina(vector<string> str)
    {
    vector<int> re(32,0);
        int a, b, c, d, i, rem;
        a = b = c = d = 1;
        stack<int> st;
 
        // Separate each number of the IP address
 
            a = stoi(str[0]);
            b = stoi(str[1]);
            c = stoi(str[2]);
            d = stoi(str[3]);
 
        // convert first number to binary
        for (i = 0; i <= 7; i++)
        {
            rem = a % 2;
            st.push(rem);
            a = a / 2;
        }
 
        // Obtain First octet
        for (i = 0; i <= 7; i++) {
            re[i] = st.top();
            st.pop();
        }
 
        // convert second number to binary
        for (i = 8; i <= 15; i++) {
            rem = b % 2;
            st.push(rem);
            b = b / 2;
        }
 
        // Obtain Second octet
        for (i = 8; i <= 15; i++) {
            re[i] = st.top();
            st.pop();
        }
 
        // convert Third number to binary
        for (i = 16; i <= 23; i++) {
            rem = c % 2;
            st.push(rem);
            c = c / 2;
        }
 
        // Obtain Third octet
        for (i = 16; i <= 23; i++) {
            re[i] = st.top();
            st.pop();
        }
 
        // convert fourth number to binary
        for (i = 24; i <= 31; i++) {
            rem = d % 2;
            st.push(rem);
            d = d / 2;
        }
 
        // Obtain Fourth octet
        for (i = 24; i <= 31; i++) {
            re[i] = st.top();
            st.pop();
        }
 
        return (re);
    }
 
    // cls returns class of given IP address
char cls(vector<string> str)
    {
        int a = stoi(str[0]);
        if (a >= 0 && a <= 127)
            return ('A');
        else if (a >= 128 && a <= 191)
            return ('B');
        else if (a >= 192 && a <= 223)
            return ('C');
        else if (a >= 224 && a <= 239)
            return ('D');
        else
            return ('E');
    }
 
    // Converts IP address
    // from binary to decimal form
vector<int> deci(vector<int> bi)
    {
 
        vector<int> arr(4,0);
        int a, b, c, d, i, j;
        a = b = c = d = 0;
        j = 7;
 
        for (i = 0; i < 8; i++) {
 
            a = a + (int)(pow(2, j)) * bi[i];
            j--;
        }
 
        j = 7;
        for (i = 8; i < 16; i++) {
 
            b = b + bi[i] * (int)(pow(2, j));
            j--;
        }
 
        j = 7;
        for (i = 16; i < 24; i++) {
 
            c = c + bi[i] * (int)(pow(2, j));
            j--;
        }
 
        j = 7;
        for (i = 24; i < 32; i++) {
 
            d = d + bi[i] * (int)(pow(2, j));
            j--;
        }
 
        arr[0] = a;
        arr[1] = b;
        arr[2] = c;
        arr[3] = d;
        return arr;
    }
 
int main()
    {
 
 
        string ipr = "192.168.1.1/24";
 
        // You can take user input here
        // instead of using default address
        // Ask user to enter IP address of form(x.y.z.t/n)
        cout<<"IP address CIDR format is:"<< ipr;
 
        // Separate IP address and n
        string str1 = "";
        int idx = 0;
        int len = ipr.size();
        len -= 3;
        while(len--){
            str1 += ipr[idx];
            idx++;
        }
        cout<<endl;
        cout<<"IP Address : " <<str1<<endl;
 
        string str2 = "";
        idx++;
        str2 += ipr[idx];
        idx++;
        str2 += ipr[idx];
        cout<<"Value of n : "<< str2<<endl;
        // IP address
        string tr = str1;
 
        // Split IP address into 4 subparts x, y, z, t
        //str = tr.split("\\.");
        vector<string> str;
 
        string temp;
        int n = tr.size();
        for(int i = 0; i < n; i++){
            if(tr[i] >= 48 && tr[i] <= 57)
                temp +=tr[i];
            else{
                str.push_back(temp);
                temp = "";
            }
        }
        str.push_back(temp);
        //cout<<str[0]<<endl<<str[1]<<endl<<str[2]<<endl<<str[3]<<endl;
 
        vector<int> b;
 
        cout<<endl;
 
        // Convert IP address to binary form
        b = bina(str);
 
        n = stoi(str2);
        vector<int> ntwk(32,0);
        vector<int> brd(32,0);
        int t = 32 - n;
 
        // Obtaining network address
        for (int i = 0; i <= (31 - t); i++) {
 
            ntwk[i] = b[i];
            brd[i] = b[i];
        }
 
        // Set 32-n bits to 0
        for (int i = 31; i > (31 - t); i--) {
 
            ntwk[i] = 0;
        }
 
        // Obtaining Broadcast address
        // by setting 32-n bits to 1
        for (int i = 31; i > (31 - t); i--) {
 
            brd[i] = 1;
        }
 
        cout<<endl;
 
        // Obtaining class of Address
        char c = cls(str);
        cout<<"Class : " << c << endl;
 
        // Converting network address to decimal
        vector<int> nt = deci(ntwk);
 
        // Converting broadcast address to decimal
        vector<int> br = deci(brd);
 
        // Printing in dotted decimal format
        cout<<"First Address : " << nt[0] << "." <<nt[1] <<"." << nt[2] <<"." << nt[3]<<endl;
 
        // Printing in dotted decimal format
        cout<<"Last Address : "  <<br[0] << "." <<br[1] << "." << br[2] <<"." << br[3] << endl;
 
        //Printing Number of Addresses in Block
        cout<<"Total Number of Addresses :" <<br[3]-nt[3]+1<<endl;
 
        return 0;
}

Java

import java.util.*;
import java.io.*;
import java.net.*;
import java.lang.Math;
 
class Ip {
     
    // Converts IP address to the binary form
    public static int[] bina(String[] str)
    {
        int re[] = new int[32];
        int a, b, c, d, i, rem;
        a = b = c = d = 1;
        Stack<Integer> st = new Stack<Integer>();
         
        // Separate each number of the IP address
        if (str != null)
        {
            a = Integer.parseInt(str[0]);
            b = Integer.parseInt(str[1]);
            c = Integer.parseInt(str[2]);
            d = Integer.parseInt(str[3]);
        }
         
        // convert first number to binary
        for (i = 0; i <= 7; i++)
        {
            rem = a % 2;
            st.push(rem);
            a = a / 2;
        }
         
        // Obtain First octet
        for (i = 0; i <= 7; i++) {
            re[i] = st.pop();
        }
         
        // convert second number to binary
        for (i = 8; i <= 15; i++) {
            rem = b % 2;
            st.push(rem);
            b = b / 2;
        }
         
        // Obtain Second octet
        for (i = 8; i <= 15; i++) {
            re[i] = st.pop();
        }
         
        // convert Third number to binary
        for (i = 16; i <= 23; i++) {
            rem = c % 2;
            st.push(rem);
            c = c / 2;
        }
         
        // Obtain Third octet
        for (i = 16; i <= 23; i++) {
            re[i] = st.pop();
        }
         
        // convert fourth number to binary
        for (i = 24; i <= 31; i++) {
            rem = d % 2;
            st.push(rem);
            d = d / 2;
        }
         
        // Obtain Fourth octet
        for (i = 24; i <= 31; i++) {
            re[i] = st.pop();
        }
         
        return (re);
    }
     
    // cls returns class of given IP address
    public static char cls(String[] str)
    {
        int a = Integer.parseInt(str[0]);
        if (a >= 0 && a <= 127)
            return ('A');
        else if (a >= 128 && a <= 191)
            return ('B');
        else if (a >= 192 && a <= 223)
            return ('C');
        else if (a >= 224 && a <= 239)
            return ('D');
        else
            return ('E');
    }
     
    // Converts IP address
    // from binary to decimal form
    public static int[] deci(int[] bi)
    {
         
        int[] arr = new int[4];
        int a, b, c, d, i, j;
        a = b = c = d = 0;
        j = 7;
         
        for (i = 0; i < 8; i++) {
             
            a = a + (int)(Math.pow(2, j)) * bi[i];
            j--;
        }
         
        j = 7;
        for (i = 8; i < 16; i++) {
             
            b = b + bi[i] * (int)(Math.pow(2, j));
            j--;
        }
         
        j = 7;
        for (i = 16; i < 24; i++) {
             
            c = c + bi[i] * (int)(Math.pow(2, j));
            j--;
        }
         
        j = 7;
        for (i = 24; i < 32; i++) {
             
            d = d + bi[i] * (int)(Math.pow(2, j));
            j--;
        }
         
        arr[0] = a;
        arr[1] = b;
        arr[2] = c;
        arr[3] = d;
        return arr;
    }
     
    public static void main(String args[])
    {
 
        int i;
        String[] str = new String[4];
        String ipr = "192.168.1.1/24";
 
        // You can take user input here
        // instead of using default address
        // Ask user to enter IP address of form(x.y.z.t/n)
        System.out.println("IP address CIDR format is:" + ipr);
         
        // Separate IP address and n
        String[] str1 = ipr.split("/");
         
        // IP address
        String tr = str1[0];
         
        // Split IP address into 4 subparts x, y, z, t
        str = tr.split("\\.");
 
        int[] b = new int[32];
 
        System.out.println();
         
        // Convert IP address to binary form
        b = bina(str);
 
        int n = Integer.parseInt(str1[1]);
        int[] ntwk = new int[32];
        int[] brd = new int[32];
        int t = 32 - n;
         
        // Obtaining network address
        for (i = 0; i <= (31 - t); i++) {
             
            ntwk[i] = b[i];
            brd[i] = b[i];
        }
         
        // Set 32-n bits to 0
        for (i = 31; i > (31 - t); i--) {
             
            ntwk[i] = 0;
        }
         
        // Obtaining Broadcast address
        // by setting 32-n bits to 1
        for (i = 31; i > (31 - t); i--) {
             
            brd[i] = 1;
        }
         
        System.out.println();
 
        // Obtaining class of Address
        char c = cls(str);
        System.out.println("Class : " + c);
         
        // Converting network address to decimal
        int[] nt = deci(ntwk);
         
        // Converting broadcast address to decimal
        int[] br = deci(brd);
 
        // Printing in dotted decimal format
        System.out.println("Network Address : " + nt[0]
                     + "." + nt[1] + "." + nt[2] + "." + nt[3]);
         
        // Printing in dotted decimal format
        System.out.println("Broadcast Address : "
                     + br[0] + "." + br[1] + "." + br[2] + "." + br[3]);
    }
}

Producción: 

IP address CIDR format is:192.168.1.1/24


Class : C
Network Address : 192.168.1.0
Broadcast Address : 192.168.1.255 

Publicación traducida automáticamente

Artículo escrito por roshalmoraes y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *