2015-09-10 6 views
7

Ich möchte alle IP-Adressen von Geräten in dem lokalen Netzwerk finden, mit dem ich derzeit über Java-Code verbunden bin. Das nützliche Dienstprogramm Advanced IP Scanner ist in der Lage verschiedene IP-Adressen in meinem subnet von 192.168.178/24 zu finden:Finden Sie alle IP-Adressen im lokalen Netzwerk

Nach this Antwort, ich meinen Code auf folgende Weise aufgebaut:

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"); 
    } 
} 

Leider ist dies tut keine Ergebnisse ausgeben, dh keine IP-Adressen sind erreichbar. Warum? In meinem lokalen Netzwerk befinden sich Geräte wie im Advanced IP Scanner Scan.

+0

Ich überprüfte diesen Code in meinem Netzwerk, mit Broadcast, nur meine IP oder versuchen "www.google.com". Immer sagt "nicht erreichbar". Überprüfen Sie diese Antwort: http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping-the-ip-address –

+1

Mögliches Duplikat von [Wie man a Liste der IP verbunden in demselben Netzwerk (Subnetz) mit Java] (http://stackoverflow.com/questions/3345857/how-to-get-a-list-of-ip-connected-in-same-network-subnet- using-java) – jww

Antwort

2

InetAddress.isReachable wird ICMP ECHO-REQUEST verwenden (wie wenn Sie das tun ein Ping) oder Anfrage auf Port 7 (Echo-Port): http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#isReachable%28int%29

Advance-IP Scanner vielleicht eine andere Art und Weise verwenden, um die Hosts zu entdecken (wie ein Anfrage an Radmin Port oder eine Anfrage auf http).

Ein Host kann aktiv sein, antwortet jedoch nicht auf ICMP ECHO REQUEST.

haben Sie versucht, einen der Host über die Befehlszeile anpingen?

+0

Der Host kann gepingt werden und antwortet – BullyWiiPlaza

0

Vielleicht versuchen Sie es mit InetAddress.getByAddress(host) statt getByName, wie folgt aus:

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"); 
      } 
    } 

ich diese Probe nahm für die automatische Erkennung Code from here

+0

Bist du es, VGMoose? Cheers man;) Allerdings kann Ihr Code und Ihre Anwendung meine Nintendo Wii-Konsole nicht finden, so dass Ihr Netzwerk-Scan nicht funktioniert, tut mir leid. Die Dateiübertragung funktioniert, aber ich muss die IP-Adresse meiner Wii manuell eingeben – BullyWiiPlaza

1

Versuchen Sie das Timeout zu erhöhen. Ich habe ungefähr 5000ms benutzt, das hat mir geholfen. Falls Sie wollen nicht 5000ms * 254 = 21 Minuten warten, versuchen Sie diesen Code auch mit parallel Pingen zu den Adressen: für mich

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 
    } 
} 

funktionierte perfekt.

Verwandte Themen