2008-08-15 25 views
14

¿Cómo puedo determinar la IP de mi enrutador/puerta de enlace en Java? Puedo obtener mi IP con la suficiente facilidad. Puedo obtener mi IP de Internet usando un servicio en un sitio web. ¿Pero cómo puedo determinar la IP de mi puerta de enlace?¿Cómo puedo determinar la IP de mi enrutador/puerta de enlace en Java?

Esto es algo fácil en .NET si conoce su camino. ¿Pero cómo lo haces en Java?

+4

Su puerta de enlace/enrutador en realidad tiene (al menos) dos direcciones IP. ¿Está buscando el que está frente a su nodo o el otro frente a otras redes? –

Respuesta

9

Java no hace que esto sea tan agradable como otros idiomas, desafortunadamente.Esto es lo que hice:

import java.io.*; 
import java.util.*; 

public class ExecTest { 
    public static void main(String[] args) throws IOException { 
     Process result = Runtime.getRuntime().exec("traceroute -m 1 www.amazon.com"); 

     BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream())); 
     String thisLine = output.readLine(); 
     StringTokenizer st = new StringTokenizer(thisLine); 
     st.nextToken(); 
     String gateway = st.nextToken(); 
     System.out.printf("The gateway is %s\n", gateway); 
    } 
} 

Esto supone que la puerta de enlace es el segundo token y no el tercero. Si es así, debe agregar un st.nextToken(); adicional para avanzar el tokenizador un punto más.

+4

-1: Esto no funciona para un sistema operativo que no sea Windows. –

+5

En realidad, no funciona para un sistema operativo Windows, ya que traceroute se llama tracert allí. –

1

Eso no es tan fácil como parece. Java es independiente de la plataforma, por lo que no estoy seguro de cómo hacerlo en Java. Estoy adivinando que .NET se contacta con algún sitio web que lo informa. Hay un par de formas de hacerlo. Primero, una mirada más profunda al protocolo ICMP puede darle la información que necesita. También puede rastrear la dirección IP que recorre (su ruta). Cuando se encuentre con una IP que no se encuentra en las siguientes gamas:

  • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255

es el IP un salto del suyo, y probablemente comparte algunos octetos de información con su IP.

Lo mejor de la suerte. Tendré curiosidad por escuchar una respuesta definitiva a esta pregunta.

1

Prueba de desgranar a traceroute si lo tienes.

'traceroute -m 1 www.amazon.com' emitirá algo como esto:

traceroute to www.amazon.com (72.21.203.1), 1 hops max, 40 byte packets 
1 10.0.1.1 (10.0.1.1) 0.694 ms 0.445 ms 0.398 ms 

analizar la segunda línea. Sí, es feo, pero te pondrá en marcha hasta que alguien publique algo mejor.

+1

¿Por qué el voto a favor? – Rydell

2

Puede ser mejor que utilice algo como checkmyip.org, que determinará su dirección IP pública, no necesariamente su primer enrutador: en Uni tengo una dirección IP "real", mientras que en mi casa es mi enrutador local dirección IP pública.

Puede analizar la página que devuelve, o buscar otro sitio que le permita volver a obtener la dirección IP como única cadena.

(Quiero decir cargar esta URL en Java/lo que sea, y luego obtener la información que necesita).

Esto debe ser totalmente independiente de la plataforma.

1

Matthew: Sí, eso es lo que quise decir con "Puedo obtener mi IP de Internet usando un servicio en un sitio web". Lo siento por ser simplista.

Brian/Nick: Traceroute estaría bien, excepto por el hecho de que muchos de estos enrutadores tienen ICMP desactivado y por lo tanto siempre se estanca.

Creo que una combinación de traceroute y uPnP funcionará. Eso es lo que estaba planeando hacer, solo esperaba que me faltara algo obvio.

Gracias a todos por sus comentarios, por lo que parece que no me falta nada obvio. Empecé a implementar algunos bits de uPnP para descubrir la puerta de enlace.

2

En cuanto a UPnP: tenga en cuenta que no todos los enrutadores son compatibles con UPnP. Y si lo hacen, podría desconectarse (por razones de seguridad). Entonces, su solución podría no funcionar siempre.

También debería echarle un vistazo a NatPMP.

Una biblioteca simple para UPnP se puede encontrar en http://miniupnp.free.fr/, aunque es en C ...

2

Para superar los problemas mencionados con traceroute (basado en ICMP, golpe de área amplia) se podría considerar:

  1. siga su IP pública (evita el área amplia, pero sigue siendo ICMP)
  2. Use una utilidad que no sea ICMP como ifconfig/ipconfig (sin embargo, problemas de portabilidad).
  3. Lo que parece ser la mejor y más portátil solución por ahora es que desembolsar & netstat de análisis (ver el ejemplo de código here)
3

En las ventanas analizando la salida del IPConfig te llevará a la puerta de enlace predeterminada, sin esperar una rastro.

23

En Windows, OS X, Linux, etc, entonces la respuesta de Chris Bunch se puede mejorar mucho mediante el uso de

netstat -rn 

en lugar de un comando traceroute.

La dirección IP de su puerta de enlace aparecerá en el segundo campo de la línea que comienza default o 0.0.0.0.

Esto se pone alrededor de una serie de problemas con tratar de utilizar traceroute:

  1. en Windows traceroute es en realidad tracert.exe, así que no hay necesidad de O/S dependencias en el código
  2. se trata de un comando rápido a ejecutar - se pone la información de la O/S, no desde la red
  3. traceroute a veces se bloquea por la red

El único inconveniente es que será necesario seguir leyendo las líneas de la salida netstat hasta encontrar la línea correcta, ya que habrá más de una línea de salida.

EDIT: El defecto la dirección IP de puerta de enlace se encuentra en el segundo campo de la línea que comienza con 'por defecto' si usted está en un MAC (probado en León), o en el tercer campo de la línea que comienza con '0.0.0.0' (probado en Windows 7)

de Windows:

de red de destino Máscara de red de puerta de enlace de interfaz de Metric

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

Mac:

Banderas Gateway destino Refs Uso netif caducan

por defecto 192.168.2.254 UGSc 104 4 en1

4
try{ 

    Process result = Runtime.getRuntime().exec("netstat -rn"); 

    BufferedReader output = new BufferedReader 
    (new InputStreamReader(result.getInputStream())); 

    String line = output.readLine(); 
    while(line != null){ 
    if (line.startsWith("default") == true) 
     break;  
    line = output.readLine(); 
    } 


    StringTokenizer st = new StringTokenizer(line); 
    st.nextToken(); 
    gateway = st.nextToken(); 

    st.nextToken(); 
    st.nextToken(); 
    st.nextToken(); 

    adapter = st.nextToken(); 

}catch(Exception e) { 
    System.out.println(e.toString()); 
    gateway = new String(); 
    adapter = new String(); 
} 
+0

La línea también puede comenzar con '0.0.0.0' en lugar de' predeterminado' –

1

Puede consultar la URL "http://whatismyip.com/automation/n09230945.asp". Por ejemplo:

BufferedReader buffer = null; 
    try { 
     URL url = new URL("http://whatismyip.com/automation/n09230945.asp"); 
     InputStreamReader in = new InputStreamReader(url.openStream()); 
     buffer = new BufferedReader(in); 

     String line = buffer.readLine(); 
     System.out.println(line); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (buffer != null) { 
       buffer.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
2

salida de -rn netstat es específica para la localización. en mi sistema (locale = de) la salida será similar a: ... Standardgateway: 10.22.0.1

lo que no hay línea que comienza con 'por defecto'.

por lo que usar netstat podría no ser una buena idea.

+0

¿qué sistema operativo es? En OSX no hay diferencia de configuración regional en la salida. – Alnitak

2

Esta versión se conecta a www.whatismyip.com, lee el contenido del sitio y busca a través de expresiones regulares la dirección ip y la imprime en el cmd. Es un poco mejora de MosheElishas Código

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     BufferedReader buffer = null; 
     try { 
      URL url = new URL(
        "http://www.whatismyip.com/tools/ip-address-lookup.asp"); 
      InputStreamReader in = new InputStreamReader(url.openStream()); 
      buffer = new BufferedReader(in); 
      String line = buffer.readLine(); 
      Pattern pattern = Pattern 
        .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)"); 
      Matcher matcher; 
      while (line != null) { 
       matcher = pattern.matcher(line); 
       if (matcher.matches()) { 
        line = matcher.group(2) + "." + matcher.group(3) + "." 
          + matcher.group(4) + "." + matcher.group(5); 
        System.out.println(line); 
       } 
       line = buffer.readLine(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } finally { 
      try { 
       if (buffer != null) { 
        buffer.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     BufferedReader buffer = null; 
     try { 
      URL url = new URL(
        "http://www.whatismyip.com/tools/ip-address-lookup.asp"); 
      InputStreamReader in = new InputStreamReader(url.openStream()); 
      buffer = new BufferedReader(in); 
      String line = buffer.readLine(); 
      Pattern pattern = Pattern 
        .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)"); 
      Matcher matcher; 
      while (line != null) { 
       matcher = pattern.matcher(line); 
       if (matcher.matches()) { 
        line = matcher.group(2) + "." + matcher.group(3) + "." 
          + matcher.group(4) + "." + matcher.group(5); 
        System.out.println(line); 
       } 
       line = buffer.readLine(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } finally { 
      try { 
       if (buffer != null) { 
        buffer.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
1

En las ventanas sólo se puede utilizar el siguiente comando:

ipconfig | findstr /i "Gateway" 

que le dará una salida como:

Default Gateway . . . . . . . . . : 192.168.2.1 
Default Gateway . . . . . . . . . : :: 

sin embargo no puedo ejecutar este comando con Java, va a publicar cuando me dé cuenta.

1

Puede usar el comando netstat -rn que está disponible en la plataforma de Windows, OSX, Linux, etc. Aquí está mi código:

private String getDefaultAddress() { 
     String defaultAddress = ""; 
     try { 
      Process result = Runtime.getRuntime().exec("netstat -rn"); 

      BufferedReader output = new BufferedReader(new InputStreamReader(
        result.getInputStream())); 

      String line = output.readLine(); 
      while (line != null) { 
       if (line.contains("0.0.0.0")) { 

        StringTokenizer stringTokenizer = new StringTokenizer(line); 
        stringTokenizer.nextElement(); // first element is 0.0.0.0 
        stringTokenizer.nextElement(); // second element is 0.0.0.0 
        defaultAddress = (String) stringTokenizer.nextElement(); 
        break; 
       } 

       line = output.readLine(); 

      } // while 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return defaultAddress; 

} // getDefaultAddress 
Cuestiones relacionadas