Domanda

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 il mio IP del gateway?

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

È stato utile?

Soluzione

Java non per questo piacevole come altre lingue, purtroppo.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 è il secondo token e non il terzo.Se lo è, è necessario aggiungere un supplemento di st.nextToken(); per far avanzare il tokenizer ancora uno spot.

Altri suggerimenti

Su Windows, OSX, Linux, ecc poi Chris Mazzo risposta può essere molto migliorata utilizzando

netstat -rn

in luogo di un traceroute comando.

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

Questo si ottiene un certo numero di problemi con il tentativo di utilizzare traceroute:

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

L'unico svantaggio è che è necessario per continuare a leggere le linee da netstat uscita fino a quando la linea di destra è trovato, visto che ci sarà più di una riga di output.

EDIT: L'Indirizzo IP Predefinito del Gateway è nel secondo campo della riga che inizia con "default", se siete su un MAC (testato su Lion), o in il terzo campo della riga che inizia con "0.0.0.0" (testata su Windows 7)

Windows:

Indirizzo Rete Mask Gateway Interfaccia Metrica

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

Mac:

Gateway Di Destinazione Bandiere Rif Utilizzare Netif Scadenza

di default 192.168.2.254 UGSc 104 4 en1

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

Su windows l'analisi dell'output di IPConfig avere il gateway predefinito, senza aspettare una traccia.

Si può essere meglio usare qualcosa di simile checkmyip.org che determinerà il vostro indirizzo IP pubblico - non necessariamente il primo hop router:all'Uni ho un "vero" indirizzo IP, mentre a casa è il mio router locale indirizzo IP pubblico.

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

(Io sono carico di significato questo URL in Java/qualunque cosa, e quindi ottenere le informazioni di cui hai bisogno).

Questo dovrebbe essere totalmente indipendente dalla piattaforma.

Per Quanto Riguarda L'UPnP:essere consapevoli del fatto 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.

Si dovrebbe anche dare un'occhiata al NatPMP.

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

Per superare questi problemi con traceroute (basato su ICMP, ampia zona colpita) si potrebbe prendere in considerazione:

  1. traceroute per il tuo IP pubblico (evita di ampia zona colpita, ma ancora ICMP)
  2. Utilizzare un non-ICMP di utilità come ifconfig/ipconfig (problemi di portabilità con questo, però).
  3. Quello che sembra il migliore e il più soluzione portatile per ora è di shell & parse netstat (vedere il codice di esempio qui)

l'output di netstat -rn è un locale specifico.sul mio sistema (locale=de) l'output sarà simile a:...Standardgateway:10.22.0.1

quindi non c'è nessuna linea di partenza con il 'default'.

così, usando il comando netstat potrebbe essere una buona idea.

Questa Versione si connette a www.whatismyip.com legge il contenuto del sito e la ricerca tramite espressioni regolari l'indirizzo ip e stampato per il cmd.Un po ' di miglioramento di MosheElishas Codice

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

Che non è così facile come sembra.Java è indipendente dalla piattaforma, quindi non sono sicuro di come farlo in Java.Io sono indovinare che .NET contatti a qualche sito web che riporta indietro.Ci sono un paio di modi per andare.Primo, approfondire il protocollo ICMP può darvi le informazioni di cui hai bisogno.Si può anche tracciare l'IP si può passare attraverso (rotta).Quando si verifica un IP che non è 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 di un salto di distanza dalla vostra, e probabilmente condivide un paio di ottetti di informazioni con il vostro IP.

In bocca al lupo.Sarò curioso di sentire una risposta definitiva a questa domanda.

Provare a sborsare per traceroute se si dispone di esso.

'traceroute -m 1 www.amazon.com' emetterà qualcosa di simile a questo:

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

Analizzare la seconda linea.Sì, è brutto, ma non potrai andare avanti fino a quando qualcuno pubblica qualcosa di più bello.

Matteo:Sì, è quello che intendevo con "posso avere il mio IP internet utilizzando un servizio su un sito web." Mi dispiace di essere glib.

Brian/Nick:Traceroute sarebbe bene tranne per il fatto che molti di questi router hanno ICMP disabili e così sempre bancarelle.

Penso che una combinazione di traceroute e uPnP funziona.Che è quello che stavo progettando di fare, come solo sperando che mi mancava qualcosa di ovvio.

Grazie a tutti per i vostri commenti, così suona come non mi manca nulla ovvio.Ho iniziato l'attuazione di alcuni bit di uPnP per scoprire il gateway.

È possibile eseguire una query URL "http://whatismyip.com/automation/n09230945.asp".Per 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();
        }
    }

In windows è possibile utilizzare il seguente comando:

ipconfig | findstr /i "Gateway"

Che vi darà un output simile a:

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

Tuttavia non è possibile eseguire questo comando con Java, andando a postare quando ho capire questo fuori.

È possibile utilizzare netstat -rn comando che è disponibile su Windows, OSX, Linux, ecc piattaforma.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

Non so se funziona su tutti i sistemi, ma almeno qui ho trovato questo:

import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main
{
    public static void main(String[] args)
    {
        try
        {
            //Variables to find out the Default Gateway IP(s)
            String canonicalHostName = InetAddress.getLocalHost().getCanonicalHostName();
            String hostName = InetAddress.getLocalHost().getHostName();

            //"subtract" the hostName from the canonicalHostName, +1 due to the "." in there
            String defaultGatewayLeftover = canonicalHostName.substring(hostName.length() + 1);

            //Info printouts
            System.out.println("Info:\nCanonical Host Name: " + canonicalHostName + "\nHost Name: " + hostName + "\nDefault Gateway Leftover: " + defaultGatewayLeftover + "\n");
            System.out.println("Default Gateway Addresses:\n" + printAddresses(InetAddress.getAllByName(defaultGatewayLeftover)));
        } catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
    }
    //simple combined string out of the address array
    private static String printAddresses(InetAddress[] allByName)
    {
        if (allByName.length == 0)
        {
            return "";
        } else
        {
            String str = "";
            int i = 0;
            while (i < allByName.length - 1)
            {
                str += allByName[i] + "\n";
                i++;
            }
            return str + allByName[i];
        }
    }
}

Per me questo produce:

Info:
Canonical Host Name: PCK4D-PC.speedport.ip
Host Name: PCK4D-PC
Default Gateway Leftover: speedport.ip

Default Gateway Addresses:
speedport.ip/192.168.2.1
speedport.ip/fe80:0:0:0:0:0:0:1%12

Ho bisogno di più prove su altri Sistemi/Configurazioni/PC-Gateway-Setup per confermare se funziona ovunque.Tipo di dubbio, ma questo è stato il primo che ho trovato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top