2015-09-10 8 views
7

Desidero trovare tutti gli indirizzi IP dei dispositivi nella rete locale in cui sono attualmente connesso utilizzando il codice Java. L'utilità utile Advanced IP Scanner è in grado di trovare i vari indirizzi IP nel mio subnet di 192.168.178/24:Trova tutti gli indirizzi IP nella rete locale

Secondo this risposta, ho costruito il mio codice seguente modo:

import java.io.IOException; 
import java.net.InetAddress; 

public class IPScanner 
{ 
    public static void checkHosts(String subnet) throws IOException 
    { 
     int timeout = 100; 
     for (int i = 1; i < 255; i++) 
     { 
      String host = subnet + "." + i; 
      if (InetAddress.getByName(host).isReachable(timeout)) 
      { 
       System.out.println(host + " is reachable"); 
      } 
     } 
    } 

    public static void main(String[] arguments) throws IOException 
    { 
     checkHosts("192.168.178"); 
    } 
} 

Purtroppo, questo non stampare alcun risultato, il che significa che nessun indirizzo IP è raggiungibile. Perché? Ci sono dispositivi nella mia rete locale come visto nella scansione Advanced IP Scanner.

+0

Ho controllato il codice sulla mia rete, utilizzando la trasmissione, solo il mio IP o cercando "www.google.com". Dice sempre "non raggiungibile". Controlla questa risposta: http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping-the-ip-address –

+1

Possibile duplicato di [Come ottenere un elenco di IP connessi nella stessa rete (subnet) utilizzando Java] (http://stackoverflow.com/questions/3345857/how-to-get-a-list-of-ip-connected-in-same-network-subnet- using-java) – jww

risposta

2

InetAddress.isReachable utilizzerà ICMP ECHO RICHIESTA (come quando si fa un ping) o richiesta sulla porta 7 (porta echo): http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#isReachable%28int%29

scanner

IP Advance forse usare un altro modo per scoprire i padroni di casa (come un richiesta su porta radmin o richiesta su http).

Un host può essere attivo ma non risponde a ICMP ECHO REQUEST.

hai provato a eseguire il ping di uno degli host dalla riga di comando?

+0

L'host può essere inviato al ping e risposte – BullyWiiPlaza

0

Forse provare a utilizzare InetAddress.getByAddress(host) invece di getByName, in questo modo:

InetAddress localhost = InetAddress.getLocalHost(); 
    byte[] ip = localhost.getAddress(); 

    for (int i = 1; i <= 254; i++) 
    { 
     try 
     { 
      ip[3] = (byte)i; 
      InetAddress address = InetAddress.getByAddress(ip); 

      if (address.isReachable(100)) 
      { 
       output = address.toString().substring(1); 
       System.out.print(output + " is on the network"); 
      } 
    } 

ho preso questo esempio per il rilevamento automatico di codice from here

+0

Sei tu, VGMoose? Cheers man;) Tuttavia, il tuo codice e l'applicazione non riescono a trovare la mia console Nintendo Wii in modo che la scansione della tua rete non funzioni, mi spiace. Il trasferimento di file funziona ma devo inserire manualmente l'indirizzo IP del mio Wii – BullyWiiPlaza

1

cercare di aumentare il timeout. Ho usato circa 5000ms, questo mi ha aiutato. Nel caso in cui non si vuole aspettare 5000ms * 254 = 21 minuti, prova anche questo codice con ping parallelamente agli indirizzi:

public static void getNetworkIPs() { 
    final byte[] ip; 
    try { 
     ip = InetAddress.getLocalHost().getAddress(); 
    } catch (Exception e) { 
     return;  // exit method, otherwise "ip might not have been initialized" 
    } 

    for(int i=1;i<=254;i++) { 
     final int j = i; // i as non-final variable cannot be referenced from inner class 
     new Thread(new Runnable() { // new thread for parallel execution 
      public void run() { 
       try { 
        ip[3] = (byte)j; 
        InetAddress address = InetAddress.getByAddress(ip); 
        String output = address.toString().substring(1); 
        if (address.isReachable(5000)) { 
         System.out.println(output + " is on the network"); 
        } else { 
         System.out.println("Not Reachable: "+output); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start();  // dont forget to start the thread 
    } 
} 

ha funzionato perfettamente per me.