Pegar a máscara de rede

Buenas pessoal,

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

Alguém sabe como faço isso?

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

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

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”.

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

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

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…

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

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)

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.