Operação AND com o IP

23 respostas
dfarias

Eu preciso fazer um programa em Java que o usuário entre com o IP e o programa informa caso esse IP seja de rede ou de host.
Utiliza-se a operação AND para tal, entretanto eu não sei como fazê-la.

23 Respostas

GraveDigger

Bom Dia,

Isso está com cara de exercício de faculdade/curso técnico.

Poste ai o que vc já tem e suas dúvidas mais especificamente, não “alguém pode fazer o exercício pra mim?”

Att

dfarias

boa, sherlock. ;D

eu comecei nesse post aqui http://www.guj.com.br/java/259377-calcular-o-range-de-ips#1353002

E

basicamente, se é de rede está na mesma máscara de subrede que seu computador. Ou seja, se seu computador tem ip 192.168.0.1 e a máscara é 255.255.255.0 você tem que verificar se está no intervalo 192.168.0.1 e 192.168.0.255. Lembrando que máscara de subrede pode ser, por exemplo, 255.255.128.0

dfarias

vou ser mais claro. o que eu quero é o seguinte.
ex: o usuario entre com o IP(host) 172.28.235.202 mascara 255.255.254.0
O calculo do range de IP deve ser feito apartir do endereco de rede, nesse caso: 172.28.234.0.

Então alguma ideia de como fazer a operação AND no java para identificar o endereco de rede?

E

Converta o IP em um número, converta a máscara em outro número, e então faça o AND desses dois números.
Lembre sempre que é mais fácil entender as operações intermediárias se você converter para hexadecimal ou binário (não sei o que você acha mais fácil entender). Por exemplo, o IP 192.168.0.1 é o número hexadecimal 0xC0A80001.

dfarias

existe algum outro meio além do hexadecimal?

E

Eu só falei “hexadecimal” porque achei que você saberia entender melhor com esse método. Não é preciso passar para hexadecimal ou binário, exceto para lhe ajudar a entender por que é que usa o AND ou o OR para checar se um determinado endereço está dentro de uma máscara.

dfarias

o que deve ser feito então?

E

entendi, então o que você quer é o endereço de broadcast da subrede?

Fiz esse código rapidinho, vê se te soluciona:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testeip;

/**
 *
 * @author Everton
 */
public class TesteIP {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String ip = "172.28.235.202";
        String mask = "255.255.255.0";
        
        short[] ipB = new short[4];
        short[] maskB = new short[4];
        
        int cont = 0;
        for(String ipS : ip.split("\\.")){
            System.out.println("Range IP: "+ipS);
            ipB[cont++] = (new Short(ipS)).shortValue();
        }
        cont = 0;
        
        for(String maskS : mask.split("\\.")){
            System.out.println("Range IP Mask: "+maskS);
            maskB[cont++] = (new Short(maskS)).shortValue();
        }
        
        
        System.out.print("Start Range IP: ");
        for(cont=0;cont<4;cont++){
            System.out.print((ipB[cont]&maskB[cont])+".");
            
        }
        
    }
}
E

Converta o IP para um número (como foi feito naquele post que você citou). Converta a máscara em um número (da mesma maneira). Efetue o AND desses dois números. Você deve ter aprendido no seu curso de redes o que representa o resultado desse AND. A seguir, pegue esse número, e converta de volta para um IP (nesse post também tem a resposta).

E

Dá uma olhada nessa lógica:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testeip;

/**
 *
 * @author Everton
 */
public class TesteIP {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String ip = "172.28.129.202";
        String mask = "255.255.33.0";
        
        short[] ipB = new short[4];
        short[] maskB = new short[4];
        
        int cont = 0;
        for(String ipS : ip.split("\\.")){
            System.out.println("Range IP: "+ipS);
            ipB[cont++] = (new Short(ipS)).shortValue();
        }
        cont = 0;
        
        for(String maskS : mask.split("\\.")){
            System.out.println("Range IP Mask: "+maskS);
            maskB[cont++] = (new Short(maskS)).shortValue();
        }
        
        
        System.out.print("Start Range IP: ");
        for(cont=0;cont<4;cont++){
            System.out.print((ipB[cont]&maskB[cont])+".");
            
        }
        System.out.print("Start Range IP: ");
        for(cont=0;cont<4;cont++){
            System.out.print(((maskB[cont])*(1+ipB[cont])/(1+maskB[cont]))+".");
            
        }
        
    }
}

Vê se isso te dá uma luz...

dfarias

entanglement:
Converta o IP para um número (como foi feito naquele post que você citou). Converta a máscara em um número (da mesma maneira). Efetue o AND desses dois números. Você deve ter aprendido no seu curso de redes o que representa o resultado desse AND. A seguir, pegue esse número, e converta de volta para um IP (nesse post também tem a resposta).

180 * (256^3) +48 * (256^2) + 10 * 256 + 0 = [telefone removido]

o mesmo com a mascara
255 * (256^3) + 255 * (256^2) + 192*256 + 0 = [telefone removido]

e agora?

E

Dica: o “AND” é o operador “&”

dfarias

pra mim ficou claro como a noite rsrs

E

dá uma olhada no código que te mandei para ver se clareia.

dfarias

e agora?

dfarias
evefuji:
Dá uma olhada nessa lógica:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testeip;

/**
 *
 * @author Everton
 */
public class TesteIP {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String ip = "172.28.129.202";
        String mask = "255.255.33.0";
        
        short[] ipB = new short[4];
        short[] maskB = new short[4];
        
        int cont = 0;
        for(String ipS : ip.split("\\.")){
            System.out.println("Range IP: "+ipS);
            ipB[cont++] = (new Short(ipS)).shortValue();
        }
        cont = 0;
        
        for(String maskS : mask.split("\\.")){
            System.out.println("Range IP Mask: "+maskS);
            maskB[cont++] = (new Short(maskS)).shortValue();
        }
        
        
        System.out.print("Start Range IP: ");
        for(cont=0;cont<4;cont++){
            System.out.print((ipB[cont]&maskB[cont])+".");
            
        }
        System.out.print("Start Range IP: ");
        for(cont=0;cont<4;cont++){
            System.out.print(((maskB[cont])*(1+ipB[cont])/(1+maskB[cont]))+".");
            
        }
        
    }
}

Vê se isso te dá uma luz...

sim, eu já vi. por sinal está incorreto.

eu fiz um teste com o ip = "172.28.235.202";
e a mascara = "255.255.254.0";

apareceu o seguinte:
Start Range IP: 172.28.234.0.Start Range IP: 172.28.235.0

o certo seria
172.28.234.1 (até)-> 172.28.235.254
ou

172.28.234.0 (até)-> 172.28.235.255

E

sim sim, foi lógica rápida, feita em poucos minutos, vê o que precisa mudar na lógica para dar certo. Te mostrei alguns recursos.

dfarias

sinceramente, não entendo praticamente nada do código.

dfarias
dfarias

System.out.print((ipB[cont] & maskB[cont]) + ".");

E

Sr. Farias,

O “AND” que lhe pediram para fazer está aqui neste pedaço do código:

ipB[cont]&maskB[cont]

Como você deve ter visto, o “&” é o tal do AND. OK?

Pergunta boba número 2 - não seria melhor você dar uma olhadinha na apostila de Redes que você provavelmente deve estar usando em aula?
Acho que você não está entendendo nada que a gente está escrevendo porque você está pegando informação apenas no que a gente está lhe falando aqui nos posts, e a teoria (a teoria é muito importante, sem a teoria você não consegue entender nada).
Procure em mais alguns lugares, mas o principal deve estar ensinado (ou pelo menos referenciado) nessa sua apostila.

dfarias

Obrigado pela ajuda pessoal.

[Tópico encerrado]

Criado 5 de dezembro de 2011
Ultima resposta 7 de dez. de 2011
Respostas 23
Participantes 4