Pegar a máscara de rede

9 respostas
M

Buenas pessoal,

Amigos preciso recuperar a máscara de rede de uma determinada interface.

Alguém sabe como faço isso?

9 Respostas

E

http://www.java2s.com/Tutorial/CSharp/0580__Network/GetsubnetmaskfromWin32NetworkAdapterConfiguration.htm

E

Aham, eu passei um exemplo em C#. Em Java, você pode usar a linha de comando para chamar um script vbscript que chame o WMI e obtenha a mesma informação, puxando desse objeto Win32_NetworkAdapterConfiguration.

Se quer algo mais pronto, procure no Google por: Win32_NetworkAdapterConfiguration subnet mask

E

Falei besteira, na verdade é possível fazer isso em 100% Java.

Use o método: getNetworkPrefixLength

Veja um exemplo em:

http://www.java-tips.org/java-se-tips/java.net/programmatic-access-to-network-parameters.html

Aham - ele não dá o valor “255.255.255.0” mas sim o número 24 (que é o número de bits 1 setados no endereço). Mas acho que você consegue se virar com isso - mesmo que você tenha de fazer um array de strings do tipo [0] = “0.0.0.0”, [1] = “128.0.0.0”, [2] = “160.0.0.0”, … [24] = “255.255.255.0”, [25] = “255.255.255.128” e assim por diante, até chegar a 32 = “255.255.255.255”.

A

Tente isso:

NetworkInterface networkInterface = null; InetAddress localhost = InetAddress.getLocalHost(); networkInterface = NetworkInterface.getByInetAddress(localhost); List<InterfaceAddress> addresses = networkInterface.getInterfaceAddresses(); for (InterfaceAddress add : addresses) { InetAddress inetAddress = add.getBroadcast(); if (inetAddress instanceof Inet4Address) { Inet4Address inet4Address = (Inet4Address)add.getBroadcast(); System.out.println(inet4Address); } }

Aqui funcionou (embora tenha escrito a máscara de sub-rede ao contrário)

[]´s

M

Opa desculpem a demora em responder pessoal.

Já tinha olhado esse getNetworkPrefixLength mas não tinha entendido muito bem o que fazer com ele.

Irei testar esses códigos e assim que possível irei dar um retorno.

Desde já agradeço, abraço

M

Só está acontecendo uma coisa estranha, parece ser um bug do método…

Quando estou na interface lo (loopback) com máscara 255.0.0.0 o método está retornando zero. Quando deveria retornar 8 certo?

Me corrijam se falei alguma besteira…

E

Deve estar bugado. Na minha máquina, executei este programa:

import java.io.*;
import java.net.*;
import java.util.*;

public class ListNets {

	public static void main(String args[])
		throws SocketException {
		
		for (NetworkInterface netint : Collections.list(NetworkInterface.getNetworkInterfaces())) {
			displayInterfaceInformation(netint);
		}
	}

	private static InetAddress fromNetworkPrefixLength (short npl) {
	    byte[] bytes = new byte[4];
            int n = npl > 0 ? (0x80000000 >> (npl - 1)) : 0;
            bytes[0] = (byte) ((n >>> 24) & 0xFF);
            bytes[1] = (byte) ((n >>> 16) & 0xFF);
            bytes[2] = (byte) ((n >>> 8)  & 0xFF);
            bytes[3] = (byte) (n          & 0xFF);
            try {
	    return InetAddress.getByAddress (bytes);
            } catch (java.net.UnknownHostException ex) {return null; /* não deve entrar aqui*/}
	}
	
	private static void displayInterfaceInformation(NetworkInterface netint) 
		throws SocketException {
		
		System.out.printf("Display name: %s%n", netint.getDisplayName());
		System.out.printf("Name: %s%n", netint.getName());
		for (InterfaceAddress intAddress : netint.getInterfaceAddresses()) {
		    System.out.printf("Address: %s%n", intAddress.getAddress());
	            System.out.printf("Network prefix length: %d - %s%n", intAddress.getNetworkPrefixLength(), 
                        fromNetworkPrefixLength (intAddress.getNetworkPrefixLength()));
		}
		System.out.printf("%n");
	}
}

e ele me mostrou:

C:\>java -cp . ListNets
Display name: MS TCP Loopback interface
Name: lo
Address: /127.0.0.1
Network prefix length: 8 - /255.0.0.0

Display name: Intel(R) 82567LM-3 Gigabit Network Connection - Packet Scheduler M
iniport
Name: eth0
Address: /125.255.103.82
Network prefix length: 22 - /255.255.252.0
M

Olha a saida na minha máquina:

Display name: eth0
Name: eth0
Address: /fe80:0:0:0:21c:c0ff:fee2:e7e0%2
Network prefix length: 64 - /255.255.255.255
Address: /172.16.1.92
Network prefix length: 24 - /255.255.255.0

Display name: lo
Name: lo
Address: /0:0:0:0:0:0:0:1%1
Network prefix length: 128 - /255.255.255.255
Address: /127.0.0.1
Network prefix length: 0 - /0.0.0.0

Essa é a saida do meu ifconfig -a

eth0 Link encap:Ethernet Endereço de HW 00:1c:c0:e2:e7:e0
inet end.: 172.16.1.92 Bcast:172.16.1.255 Masc:255.255.255.0
endereço inet6: fe80::21c:c0ff:fee2:e7e0/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
pacotes RX:3308562 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:1450013 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:1000
RX bytes:555872802 (555.8 MB) TX bytes:99396621 (99.3 MB)
IRQ:27 Endereço de E/S:0xc000

lo Link encap:Loopback Local
inet end.: 127.0.0.1 Masc:255.0.0.0
endereço inet6: ::1/128 Escopo:Máquina
UP LOOPBACK RUNNING MTU:16436 Métrica:1
pacotes RX:227516 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:227516 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:0
RX bytes:134617229 (134.6 MB) TX bytes:134617229 (134.6 MB)

T

De fato, há algum bug no método getNetworkPrefixLength() para o caso do Linux. Talvez você tenha de criar um caso especial para localhost.

Não tinha testado para o caso IPv6, que você mostrou. O método do Entanglement é bem bitolado e retorna um endereço IPv4.

Criado 19 de fevereiro de 2010
Ultima resposta 23 de fev. de 2010
Respostas 9
Participantes 4