address.isReachable no descubrirá todos los nodos en una red
He recortado mi código a lo esencial, es bastante simple y directo.
Tengo el siguiente código:
public ArrayList<Node> getNodes() throws IOException
{
ArrayList<Node> nodes = new ArrayList<Node>();
StringBuffer root = new StringBuffer(InetAddress.getLocalHost().getHostAddress());
while(!root.toString().endsWith("."))
root.deleteCharAt(root.length() - 1);
//^^ this code gets the ip, for ex 127.0.0.1, and trims the last number, to make it
//^^ 127.0.0. <-- see the trailing 0
for(int host = 0;host < 256; host++)
{
InetAddress address = InetAddress.getByName(root.toString() + host);
try
{
if(address.isReachable(500)) // pings the address
nodes.add(new Node(address.getHostAddress(), false));
}catch(Exception e){new Node(address.getHostAddress(), true);}
}
return nodes;
}
Aquí está la clase de nodo, que es bastante simple:
public class Node
{
public Node(String address, boolean restricted)
{
this.address = address;
this.restricted = restricted;
}
public String address;
public boolean restricted;
}
Aquí está mi código principal, que ejecuta getNodes ():
case 1:
System.out.println("Searching for nodes...");
NodeDetector node = new NodeDetector(); // this is the class
//where getNodes resides
ArrayList<Node> nodes = node.getNodes();
Iterator<Node> it = nodes.iterator();
while(it.hasNext())
{
System.out.println("Node: "+it.next().address);
}
System.out.println("stopped searching for nodes...");
break;
Aquí está mi salida:
Searching for nodes...
Node: 00.00.17.99
Node: 00.00.17.100
Node: 00.00.17.149
Node: 00.00.17.150 <-- this is my computer
Node: 00.00.17.154
Node: 00.00.17.156
Node: 00.00.17.254
stopped searching for nodes...
Ahora aquí está el problemaTengo una herramienta de descubrimiento de nodos de red que descargué en mi teléfono y puedo encontrar al menos 5 nodos más. Intenté cambiar el valor del tiempo de espera, pero todavía no tengo suerte. Cuando hago ping a una dirección que se encuentra con la herramienta de red en mi teléfono y no en mi computadora, el ping se recibe y devuelve instantáneamente. Esta pregunta es similar y me ha ayudado un poco, pero todavía estoy atascado:
¿Cómo hacer un verdadero ping de Java desde Windows?Estoy ejecutando mi herramienta en un mac, parece que funciona bien recogiendo otros macs, iPods y enrutadores, pero eso es todo. ¿Por qué mi programa no puede detectar los otros dispositivos en la red?
Aquí está la salida que obtengo de mi herramienta de red en mi teléfono:
00.00.17.99 <-- SMC Networks *
00.00.17.100 <-- XEROX *
00.00.17.133 <-- My Phone (Android)
00.00.17.134 <-- Intel
00.00.17.142 <-- Apple
00.00.17.149 <-- Apple *
00.00.17.150 <-- Apple * <-- this is my computer
00.00.17.154 <-- Apple *
00.00.17.155 <-- Intel
00.00.17.156 <-- Apple *
00.00.17.158 <-- Motorola Mobility
00.00.17.254 <-- Netopia *
Pongo un * donde la herramienta en mi teléfono está de acuerdo con la herramienta que estoy escribiendo en mi computadora. He ejecutado esta prueba un par de veces, tengo la misma salida cada vez en mi computadora y en mi teléfono, no se agregaron ni eliminaron dispositivos de la red durante las pruebas.