Ping no java

Como faço para criar uma classe ou método igual que funcione da mesma maneira que o ping? obrigado.

Eu estava tentando fazer isso um tempo atrás…

Não dá. O ping requer a criação de um pacote ICMP, que por sua vez requer acesso a um RAW_SOCKET, que por sua vez, requer acesso root ao sistema (ele permite a criação de sniffers, por isso a restrição), na maioria dos Unix.

Provavelmente por isso, o Java não tem suporte ao protocolo, apenas a protocolos mais alto-nível como TCP e UDP.

Pra fazer isso, use alguma biblioteca C pra rede em baixo-nível (pcap/winpcap, por exemplo) e chame via JNI, creio que é o único jeito.

Tetsuo

Chamar /usr/bin/ping, talvez? :slight_smile:

É, ou isso :slight_smile:

Para qualquer coisa que não seja simples vai dar bastante trabalho.

  1. Você pode usar o JDK 5.0? Se puder, existe um método novo chamado “isReachable”. Ele não é exatamente um ping, mas uma combinação de vários métodos que determinam se um determinado endereço está acessível (“reachable”). Ele tenta fazer um PING se seu usuário tiver permissão para tanto, manda os pacotes ICMP ECHO. Se não puder fazer isso, tenta conectar-se ao endereço no serviço ECHO TCP ou UDP (que nem sempre está ativado; no caso do Windows NT/2000/2003, por exemplo, é necessário instalar o serviço de ECHO).
  2. Se você não pode usar o JDK 5.0 é sempre possível usar o ping (no Windows 2003 ele está em \windows\system32\ping.exe, no Linux costuma estar em /bin/ping, no Solaris em algum outro lugar (não sei se é em /usr/ucb/ping, não lembro de cor); mas você precisa fazer um monte de “ifs” para checar que SO você está usando para poder entender a saída do ping.

Pessoal eu estou precisando da mesma coisa, e o isReachable é minha solução, porém vou precisar isto para uma grande rede local onde os ip’s são 172.6.x.x

segue o método da minha servlet:

         public void pinga(HttpServletRequest req){
		String ip[] = req.getLocalAddr().split("[.]");
		byte[] addr = {	new Byte(ip[0]).byteValue(),
						new Byte(ip[1]).byteValue(),
						new Byte(ip[2]).byteValue(),
						new Byte(ip[3]).byteValue()};
		try {
			InetAddress pingador = InetAddress.getByAddress(addr);
			pingador.isReachable(3000);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

O meu problema é que o método InetAddress.getByAddress() recebe um array de bytes ou seja vai aceitar um valor máximo de 127 em cada elemento do array… os ip’s já começam com 172… dae ferrou…

Estou peqsuisando na api a classe InetAddress mas não estou achando nenhuma informação quanto a esta limitação.

Uma maneira é utilizar o ping do próprio windows, com a desvantagem de só funcionar no windows:

Process p = Runtime.getRuntime().exec("ping -n 1 "+IP);
int status = p.waitFor();
if (status!=0) ping=false;

Ou como citado anteriormente, porém usando getByName que aceita Strings:

try {
InetAddress Host = InetAddress.getByName(“172.168.1.1”);
if (Host.isReachable(1000)) ping = true;
else ping = false;
} catch (UnknownHostException ex) { … }

[quote=vhuzalo]Pessoal eu estou precisando da mesma coisa, e o isReachable é minha solução, porém vou precisar isto para uma grande rede local onde os ip’s são 172.6.x.x

segue o método da minha servlet:

         public void pinga(HttpServletRequest req){
		String ip[] = req.getLocalAddr().split("[.]");
		byte[] addr = {	new Byte(ip[0]).byteValue(),
						new Byte(ip[1]).byteValue(),
						new Byte(ip[2]).byteValue(),
						new Byte(ip[3]).byteValue()};
		try {
			InetAddress pingador = InetAddress.getByAddress(addr);
			pingador.isReachable(3000);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

O meu problema é que o método InetAddress.getByAddress() recebe um array de bytes ou seja vai aceitar um valor máximo de 127 em cada elemento do array… os ip’s já começam com 172… dae ferrou…

Estou peqsuisando na api a classe InetAddress mas não estou achando nenhuma informação quanto a esta limitação. [/quote]

Olá…

Byte Aceita valores entre -128 a 127…Descobri que InetAddress.getByAddress(addr) interpreta os valores de -128 a -1 como sendo o intervalo 128 a 255…ex: -127 = 129, então fiz o seguinte algoritmo, que adequa os valores ao formato usado pelo getByAddress(addr):

            for(int i = 0; i < ip.length; i++){
                if(Integer.parseInt(ip[i]) >= 128){
                    ip[i] = "" + (Integer.parseInt(ip[i])- 256);
                }
            }

Para retornar o endereço ip inserido use "pingador.toString()".