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.
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
boa, sherlock. ;D
eu comecei nesse post aqui http://www.guj.com.br/java/259377-calcular-o-range-de-ips#1353002
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
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?
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.
existe algum outro meio além do hexadecimal?
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.
o que deve ser feito então?
entendi, então o que você quer é o endereço de broadcast da subrede?
Fiz esse código rapidinho, vê se te soluciona:
[code]/*
- 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])+”.”);}
}
}
[/code] -
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).
Dá uma olhada nessa lógica:
[code]/*
- 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]))+”.”);}
}
}
[/code] -
Vê se isso te dá uma luz…
[quote=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).
[/quote]
180 * (256^3) +48 * (256^2) + 10 * 256 + 0 = 3023047168
o mesmo com a mascara
255 * (256^3) + 255 * (256^2) + 192*256 + 0 = 4294950912
e agora?
Dica: o “AND” é o operador “&”
pra mim ficou claro como a noite rsrs
dá uma olhada no código que te mandei para ver se clareia.
e agora?
[quote=evefuji]Dá uma olhada nessa lógica:
[code]/*
- 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]))+”.”);}
}
}
[/code] -
Vê se isso te dá uma luz…[/quote]
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
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.
sinceramente, não entendo praticamente nada do código.