2015-09-10 2 views
7

Je souhaite trouver toutes les adresses IP des périphériques du réseau local auquel je suis actuellement connecté à l'aide du code Java. L'utilitaire utile Advanced IP Scanner est en mesure de trouver différentes adresses IP dans mon subnet de 192.168.178/24:Rechercher toutes les adresses IP dans le réseau local

Selon this réponse, je construit mon code de la manière suivante:

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

Malheureusement, cela ne n'imprime aucun résultat, ce qui signifie qu'aucune adresse IP n'est accessible. Pourquoi? Comme le montre le scan Advanced IP Scanner, il y a des périphériques sur mon réseau local.

+0

J'ai vérifié ce code sur mon réseau, en utilisant la diffusion, juste le mien IP ou en essayant "www.google.com". Dit toujours "pas joignable". Cochez cette réponse: http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping-the-ip-address –

+1

Copie possible de [Comment obtenir un liste des adresses IP connectées dans le même réseau (sous-réseau) en utilisant Java] (http://stackoverflow.com/questions/3345857/how-to-get-a-list-of-ip-connected-in-same-network-subnet- using-java) – jww

Répondre

2

InetAddress.isReachable utilisera ICMP ECHO REQUEST (comme lorsque vous faites un ping) ou demande sur le port 7 (port écho): http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#isReachable%28int%29

scanner Advance IP peut-être utiliser une autre façon de découvrir les hôtes (comme un demande sur port radmin ou une requête sur http).

Un hôte peut être en attente mais ne répond pas à la demande ICMP ECHO. Avez-vous essayé d'envoyer une commande ping à l'un des hôtes à partir de la ligne de commande?

+0

L'hôte peut être pingué et répond – BullyWiiPlaza

0

Peut-être essayer en utilisant InetAddress.getByAddress(host) au lieu de getByName, comme ceci:

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

J'ai pris cet exemple pour le code de détection automatique from here

+0

Est-ce vous, VGMoose? Bravo homme;) Cependant, votre code et votre application ne parviennent pas à trouver ma console Nintendo Wii pour que votre scan réseau ne fonctionne pas, désolé. Le transfert de fichiers fonctionne mais je dois entrer manuellement l'adresse IP de ma Wii – BullyWiiPlaza

1

Essayez d'augmenter le délai d'attente. J'ai utilisé environ 5000ms, cela m'a aidé. Si vous ne voulez pas attendre 5000ms * 254 = 21 minutes, essayez également ce code avec pinging parallèle aux adresses:

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

ont parfaitement fonctionné pour moi.