Come posso determinare l'IP del mio router / gateway in Java?


Come posso determinare l'IP del mio router/gateway in Java? Posso ottenere il mio IP abbastanza facilmente. Posso ottenere il mio IP Internet utilizzando un servizio su un sito web. Ma come posso determinare l'IP del mio gateway?

Questo è un po ' facile in.NET se conosci il tuo modo per aggirare. Ma come si fa a farlo in Java?

Author: liut0, 2008-08-15

15 answers

Java non lo rende piacevole come gli altri linguaggi, sfortunatamente. Ecco cosa ho fatto:

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

Ciò presuppone che il gateway sia il secondo token e non il terzo. Se lo è, è necessario aggiungere un extra st.nextToken(); per far avanzare il tokenizer di un altro punto.

 10
Author: Chris Bunch, 2008-08-15 06:38:21

Su Windows, OSX, Linux, ecc. la risposta di Chris Bunch può essere molto migliorata usando

netstat -rn

Al posto di un comando traceroute.

L'indirizzo IP del gateway apparirà nel secondo campo della riga che inizia default o 0.0.0.0.

Questo risolve una serie di problemi con il tentativo di usare traceroute:

  1. su Windows traceroute è in realtà tracert.exe, quindi non c'è bisogno di dipendenze O / S nel codice
  2. è un comando rapido da eseguire-ottiene informazioni dall'O / S, non dalla rete
  3. traceroute a volte è bloccato dalla rete

L'unico inconveniente è che sarà necessario continuare a leggere le righe dall'output netstat fino a quando non verrà trovata la riga giusta, poiché ci sarà più di una riga di output.

MODIFICA: L'indirizzo IP del gateway predefinito si trova nel secondo campo della riga che inizia con 'default' se si è su un MAC (testato su Lion), o nel terzo campo della riga che inizia con ' 0.0.0.0 '(testato su Windows 7)

Finestre:

Metrica di interfaccia gateway Netmask di destinazione di rete

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

Mac:

Flag di gateway di destinazione I Refs utilizzano Netif Expire

Predefinito 192.168.2.254 UGSc 104 4 en1

 23
Author: Alnitak, 2012-07-24 14:28:01
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();
}
 4
Author: Hamza Yerlikaya, 2018-08-01 15:57:30

Su Windows analizzando l'output di IPConfig si otterrà il gateway predefinito, senza attendere una traccia.

 3
Author: bruceatk, 2008-09-14 12:54:43

Potrebbe essere meglio usare qualcosa di simile checkmyip.org, che determinerà il tuo indirizzo IP pubblico-non necessariamente il tuo primo router hop: a Uni ho un indirizzo IP "reale", mentre a casa è l'indirizzo IP pubblico del mio router locale.

È possibile analizzare la pagina che restituisce, o trovare un altro sito che consente di ottenere solo l'indirizzo IP come unica stringa.

(Intendo caricare questo URL in Java/qualunque cosa, e quindi ottenere le informazioni di cui hai bisogno).

Questo dovrebbe essere totalmente indipendente dalla piattaforma.

 2
Author: Matthew Schinckel, 2008-08-15 06:15:16

Per quanto riguarda UPnP: tieni presente che non tutti i router supportano UPnP. E se lo fanno potrebbe essere spento (per motivi di sicurezza). Quindi la tua soluzione potrebbe non funzionare sempre.

Dovrebbe anche dare un'occhiata a NatPMP.

Una semplice libreria per UPnP può essere trovata in http://miniupnp.free.fr / , anche se è in C...

 2
Author: akr, 2008-09-05 21:42:54

Per superare i problemi menzionati con traceroute (ICMP-based, vasta area hit) si potrebbe prendere in considerazione:

  1. traceroute al tuo IP pubblico (evita hit su un'ampia area, ma ancora ICMP)
  2. Usa un'utilità non ICMP come ifconfig/ipconfig (problemi di portabilità con questo però).
  3. Quella che sembra la soluzione migliore e più portatile per ora è shell e analisi netstat (vedi l'esempio di codice qui)
 2
Author: tardate, 2008-09-14 11:51:59

L'output di netstat-rn è specifico per le impostazioni locali. sul mio sistema (locale=de) l'output appare come: ... Standardgateway: 10.22.0.1

Quindi non c'è linea che inizia con 'default'.

Quindi usare netstat potrebbe non essere una buona idea.

 2
Author: , 2009-04-23 10:58:39

Questa versione si connette a www.whatismyip.com, legge il contenuto del luogo e cerca via espressioni regolari l'indirizzo di ip e lo stampa al cmd. È un piccolo miglioramento del codice MosheElishas

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();
            }
        }
    }
}
 2
Author: Loki Nightray, 2012-01-25 15:46:50

Non è così facile come sembra. Java è indipendente dalla piattaforma, quindi non sono sicuro di come farlo in Java. Sto indovinando che.NET contatti qualche sito web che lo riporta. Ci sono un paio di modi per andare. In primo luogo, uno sguardo più approfondito nel protocollo ICMP può fornire le informazioni necessarie. È inoltre possibile tracciare l'IP si passa attraverso (il percorso). Quando si verifica un IP che non si trova nei seguenti intervalli:

  • 10.0.0.0 – 10.255.255.255
  • 172.16.0.0 – 172.31.255.255
  • 192.168.0.0 – 192.168.255.255

È l'IP a un salto dal tuo, e probabilmente condivide alcuni ottetti di informazioni con il tuo IP.

Buona fortuna. Sarò curioso di sentire una risposta definitiva a questa domanda.

 1
Author: Brian, 2008-08-15 03:49:48

Prova a sborsare su traceroute se ce l'hai.

"traceroute-m 1 www.amazon.com' emetterà qualcosa del genere:

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

Analizza la seconda riga. Sì, è brutto, ma ti farà andare avanti finché qualcuno non pubblica qualcosa di più bello.

 1
Author: Nick Brosnahan, 2008-08-15 04:25:23

Matthew: Sì, questo è ciò che intendevo con " Posso ottenere il mio IP Internet utilizzando un servizio su un sito web."Mi dispiace di essere glib.

Brian/Nick: Traceroute andrebbe bene tranne per il fatto che molti di questi router hanno ICMP disabilitato e quindi si blocca sempre.

Penso che una combinazione di traceroute e UPnP funzionerà. Questo è quello che stavo pensando di fare, io come solo sperando mi mancava qualcosa di ovvio.

Grazie a tutti per i tuoi commenti, quindi sembra che io sia non manca nulla di ovvio. Ho iniziato ad implementare alcuni bit di UPnP per scoprire il gateway.

 1
Author: Frank Krueger, 2008-08-15 06:34:49

È possibile interrogare l'URL " http://whatismyip.com/automation/n09230945.asp". Ad esempio:

    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();
        }
    }
 1
Author: , 2008-11-08 18:05:28

In Windows puoi semplicemente usare il seguente comando:

ipconfig | findstr /i "Gateway"

Che ti darà l'output come:

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

Tuttavia non posso eseguire questo comando con Java, pubblicherò quando lo capirò.

 1
Author: ZZ 5, 2013-12-27 19:01:17

È possibile utilizzare il comando netstat -rn disponibile sulla piattaforma Windows, OSX, Linux, ecc. Ecco il mio codice:

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
 1
Author: chandan, 2016-04-17 18:18:01