Frage

Wie Ermittle ich die IP von meinem router/gateway in Java?Kann ich meine IP-leicht genug.Kann ich meine internet-IP mit einem service, der auf einer website.Aber wie kann ich feststellen, mein gateway ist die IP?

Das ist etwas zu einfach .NET, wenn Sie wissen, Ihren Weg rund um.Aber wie tun Sie es in Java?

War es hilfreich?

Lösung

Java nicht machen dies so angenehm wie andere Sprachen, leider.Hier ist, was ich getan habe:

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

Dies setzt Voraus, dass das gateway ist das zweite token und nicht die Dritte.Wenn es ist, Sie müssen fügen Sie eine zusätzliche st.nextToken(); zu Voraus die tokenisierung eine weitere Stelle.

Andere Tipps

Auf Windows, OSX, Linux, etc, dann Chris Bunch ' s Antwort kann viel verbessert werden, durch die Verwendung

netstat -rn

an die Stelle einer traceroute Befehl.

Der gateway-IP-Adresse erscheint in der zweiten Zeile, die beginnt entweder default oder 0.0.0.0.

Dieses wird um eine Reihe von Problemen mit den versuchen, zu verwenden traceroute:

  1. auf Windows traceroute tatsächlich tracert.exe, so gibt es keine Notwendigkeit für die O/S-Abhängigkeiten im code
  2. es ist eine schnelle Befehl ausgeführt wird - es wird Informationen aus dem O/S, nicht aus dem Netzwerk
  3. traceroute manchmal blockiert durch die Netzwerk

Der einzige Nachteil ist, dass es notwendig sein wird, Lesen Sie die Zeilen aus der netstat so lange ausgegeben, bis die richtige Linie zu finden, da gibt es dann auch mehr als eine Zeile in der Ausgabe.

EDIT: Die Standard-Gateway-IP-Adresse in das zweite Feld der Zeile, die mit 'default', wenn Sie auf einem MAC (getestet unter Lion), oder in der das Dritte Feld, die Zeile, die mit '0.0.0.0' (getestet unter Windows 7)

Windows:

Network Destination Netmask Gateway Interface Metric

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

Mac:

Destination Gateway Flags Refs Use Netif Expire

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

Auf windows Parsen der Ausgabe von IPConfig, erhalten Sie den Standard-gateway, ohne zu warten, für eine Spur.

Sie können es besser mit so etwas wie checkmyip.org, die bestimmen werden, Ihre öffentliche IP-Adresse - nicht unbedingt Ihre first-hop-router:an der Uni habe ich eine "echte" IP-Adresse in der Erwägung, dass zu Hause ist es meinem lokalen router die öffentliche IP-Adresse.

Sie können analysieren, die Seite, zurück, oder finden eine andere Website, können Sie nur die IP-Adresse zurück, die als einzige Zeichenkette.

(Ich bin mir Sinn laden Sie diese URL in Java/was auch immer, und dann bekommen Sie die Informationen, die Sie benötigen).

Dies sollte völlig unabhängig von der Plattform.

Über UPnP:beachten Sie, dass nicht alle Router die UPnP unterstützen.Und wenn Sie es tun könnte ausgeschaltet werden (aus Sicherheitsgründen).Damit Ihre Lösung möglicherweise nicht immer funktioniert.

Sie sollten auch einen Blick auf NatPMP.

Eine einfache Bibliothek für UPnP finden Sie unter http://miniupnp.free.fr/, obwohl es in C...

Zur überwindung der genannten Fragen mit "traceroute" (ICMP-Basis, wide-area hit), die Sie in Betracht ziehen könnte:

  1. traceroute durch, um Ihre öffentliche IP (vermeidet wide-area hit, aber immer noch ICMP)
  2. Verwenden Sie einen nicht-ICMP-Dienstprogramm wie ifconfig/ipconfig (Portabilität Probleme mit diesem, obwohl).
  3. Was scheint die beste und die meisten tragbaren Lösung für jetzt ist shell & analysieren netstat (siehe code-Beispiel hier)

Ausgabe von netstat -rn locale-spezifisch.auf meinem system (locale=de) die Ausgabe sieht wie folgt aus:...Standardgateway:10.22.0.1

so gibt es keine Zeile beginnt mit 'Standard'.

so mit netstat kann keine gute Idee.

Diese Version verbindet www.whatismyip.com liest den Inhalt der site und suchen über reguläre Ausdrücke, die ip-Adresse und druckt es um die cmd.Seine eine kleine Verbesserung der MosheElishas Code

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

Das ist nicht so einfach, wie es klingt.Java ist plattformunabhängig, so dass ich nicht sicher bin, wie es in Java.Ich bin raten das .NET Kontakte zu einigen web-site, welche Berichte es zurück.Es gibt ein paar Wege zu gehen.Den ersten, einen tieferen Blick in das Protokoll ICMP können Sie die Informationen, die Sie benötigen.Sie können auch verfolgen der IP gehen Sie durch (Ihre route).Wenn Sie auf eine IP, die nicht in den folgenden Bereichen:

  • 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 ist der IP man-hop Weg von Ihnen, und wahrscheinlich Aktien, die ein paar Bytes von Informationen mit Ihrer IP -.

Viel Glück.Ich werde gespannt sein zu hören, eine endgültige Antwort auf diese Frage.

Versuchen Beschuss aus, um ein traceroute durch, wenn Sie es haben.

'traceroute -m 1 www.amazon.com' emittieren, so etwas wie dieses:

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

Analysieren Sie die zweite Zeile.Ja, es ist hässlich, aber es wird Euch gehen, bis jemand stellt etwas schöner.

Matthew:Ja, das ist es, was ich gemeint mit "kann ich meine internet-IP mit einem service, der auf einer website." Sorry about being glib.

Brian/Nick:Traceroute wäre in Ordnung, außer der Tatsache, dass viele dieser Router haben ICMP deaktiviert und so ist es immer Stände.

Ich denke, eine Kombination von "traceroute" und uPnP funktioniert.Das ist das, was ich war in der Planung zu tun, als ich zu hoffen war ich etwas fehlt offensichtlich.

Ich danke Ihnen allen für Ihre Kommentare, so dass es klingt wie ich bin nichts fehlt offensichtlich.Ich habe mit der Umsetzung begonnen, einige bits des uPnP, um entdecken Sie die gateway.

Sie können die Abfrage der URL "http://whatismyip.com/automation/n09230945.asp".Zum Beispiel:

    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 können Sie einfach den folgenden Befehl verwenden:

ipconfig | findstr /i "Gateway"

Die geben Sie eine Ausgabe wie:

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

Allerdings kann ich nicht diesen Befehl ausführen mit Java, posten werde, wenn ich herausfinde.

Sie können verwenden netstat -rn der Befehl ist auf Windows, OSX, Linux, etc-Plattform.Hier ist mein code:

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

Ich bin mir nicht sicher, ob es funktioniert auf jedem system, aber zumindest hier fand ich dies:

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

Für mich ist dieses produziert:

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

Ich würde erfordern, mehr tests auf anderen Betriebssystemen/Konfigurationen-PC-Gateway-Setups zu bestätigen, ob es funktioniert überall.Art von Zweifel, aber diese war die erste, die ich fand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top