Cum pot determina IP-ul routerului/gateway-ului meu în Java?

Cum pot determina IP-ul routerului/gateway-ului meu în Java? Pot să-mi obțin destul de ușor IP-ul. Pot obține IP-ul meu de internet utilizând un serviciu pe un site web. Dar cum pot determina IP-ul gateway-ului meu?

Acest lucru este oarecum usor in .NET daca stiti cum va aflati in jur. Dar cum o faci în Java?

0
fr hi bn
Gateway-ul/ruterul are de fapt (cel puțin) două adrese IP. Căutați unul care se confruntă cu nodul dvs. sau celalalt (e) cu care se confruntă în amonte față de alte rețele?
adăugat autor Tall Jeff, sursa

13 răspunsuri

S-ar putea să fiți mai bine folosind ceva de genul checkmyip.org, care vă va determina adresa IP publică - nu neapărat primul dvs. ruter hip: la Uni am o adresă IP "reală", în timp ce la domiciliu este adresa IP publică a routerului meu local.

Puteți parsa pagina care se întoarce sau puteți găsi un alt site care vă permite să primiți doar adresa IP înapoi ca singurul șir.

(Înseamnă să încărcați această adresă URL în Java/orice, apoi să obțineți informațiile de care aveți nevoie).

Acest lucru ar trebui să fie complet independent de platformă.

0
adăugat

Java nu face acest lucru la fel de plăcut ca alte limbi, din păcate. Iată ce am făcut:

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

Acest lucru presupune că gateway-ul este al doilea token și nu al treilea. Dacă este, trebuie să adăugați un extra st.nextToken (); pentru a avansa încă un punct.

0
adăugat
De fapt, nu funcționează pentru Windows-OS, așa cum se numește traceroute acolo.
adăugat autor Thorbjørn Ravn Andersen, sursa
-1: Acest lucru nu funcționează pentru o fereastră non-windows.
adăugat autor Martijn Courteaux, sursa

Pe ferestrele de parsare, ieșirea din IPConfig vă va primi gateway-ul implicit, fără a aștepta o urmă.

0
adăugat

Matthew: Da, asta am vrut sa spun prin "pot sa-mi primesc IP-ul pe Internet folosind un serviciu pe un site web". Îmi pare rău că am fost glib.

Brian/Nick: Traceroute ar fi bine, cu excepția faptului că o mulțime de astfel de routere au ICMP dezactivat și, astfel, este întotdeauna tarabă.

Cred că o combinație de traceroute și uPnP va funcționa. Asta mi-am plănuit să fac, sper că am lipsit ceva evident.

Vă mulțumesc tuturor pentru comentariile dvs., deci suna ca și cum nu voi lipsi nimic evident. Am început să pun în aplicare câteva bucăți de uPnP pentru a descoperi poarta.

0
adăugat

Pe Windows, OSX, Linux, etc, atunci răspunsul lui Chris Bunch poate fi mult îmbunătățit prin utilizarea

netstat -rn

în locul unei comenzi traceroute .

Adresa IP a gateway-ului dvs. va apărea în cel de-al doilea câmp al liniei care începe fie cu default , fie cu 0.0.0.0 .

Aceasta se întâmplă în jurul unor probleme cu încercarea de a utiliza traceroute :

  1. on Windows traceroute is actually tracert.exe, so there's no need for O/S dependencies in the code
  2. it's a quick command to run - it gets information from the O/S, not from the network
  3. traceroute is sometimes blocked by the network

Singurul dezavantaj este că va fi necesar să continuați să citiți linii de la ieșirea netstat până când linia dreaptă este găsită, deoarece vor exista mai multe linii de ieșire.

EDIT: The Default Gateway's IP Address is in the second field of the line that starts with 'default' if you are on a MAC (tested on Lion), or in the third field of the line that starts with '0.0.0.0' (tested on Windows 7)

ferestre:

    

Metricul pentru interfața Gateway Netmask Destinație de rețea

         

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

  

Mac:

    

Destinație Gateway Flags Refs Utilizați Netif Expire

         

implicit 192.168.2.254 UGSc 104 4 en1

  
0
adăugat

Pentru a depăși problemele menționate cu traceroute (pe baza ICMP-ului, a lovit zona largă), puteți lua în considerare:

  1. traceroute to your public IP (avoids wide-area hit, but still ICMP)
  2. Use a non-ICMP utility like ifconfig/ipconfig (portability issues with this though).
  3. What seems the best and most portable solution for now is to shell & parse netstat (see the code example here)
0
adăugat

Puteți utiliza comanda netstat -rn care este disponibilă pe platforma Windows, OSX, Linux etc. Aici este codul meu:

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
0
adăugat

În ceea ce privește UPnP: fiți conștienți de faptul că nu toate routerele suportă UPnP. Și dacă o fac, ar putea fi dezactivată (din motive de securitate). Deci, soluția dvs. ar putea să nu funcționeze întotdeauna.

De asemenea, ar trebui să aruncați o privire la NatPMP.

O bibliotecă simplă pentru UPnP poate fi găsită la http://miniupnp.free.fr/ , deși este în C ...

0
adăugat

Încercați să scoateți din afară traceroute dacă aveți.

'traceroute -m 1 www.amazon.com' va emite ceva de genul:

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

Parsează al doilea rând. Da, e urât, dar te va duce până când cineva va face ceva mai frumos.

0
adăugat
De ce scăderea?
adăugat autor Rydell, sursa

Nu este așa de ușor cum sună. Java este platformă independentă, deci nu sunt sigur cum să o fac în Java. Sunt ghicit că .NET contactează un site web care îl raportează. Există câteva căi de parcurs. În primul rând, o privire mai aprofundată asupra protocolului ICMP vă poate furniza informațiile de care aveți nevoie. De asemenea, puteți urmări IP-ul prin care treceți (traseul). Când întâlniți un IP care nu se află în următoarele domenii:

  • 10,0,0,0? 10.255.255.255
  • 172.16.0.0? 172.31.255.255
  • 192.168.0.0? 192.168.255.255

IP-ul se află într-o poziție ascunsă de dvs. și probabil împarte câțiva octeți de informații cu IP-ul dvs.

Mult noroc. Voi fi curios să aud un răspuns definitiv la această întrebare.

0
adăugat
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
adăugat
Linia poate începe, de asemenea, cu 0.0.0.0 în loc de default
adăugat autor Alex Abdugafarov, sursa

Această versiune se conectează la www.whatismyip.com, citește conținutul site-ului și caută prin expresii regulate adresa IP și o tipărește în cmd. Este o mică îmbunătățire a codului lui MosheElisias

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();
            }
        }
    }
}
0
adăugat

În ferestre, puteți folosi următoarea comandă:

ipconfig | findstr /i "Gateway"

Ceea ce vă va da rezultate precum:

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

Cu toate acestea, nu pot rula această comandă cu Java, voi posta când îmi dau seama.

0
adăugat