17

Java でルーター/ゲートウェイの IP を特定するにはどうすればよいですか? IP は簡単に取得できます。Web サイトのサービスを使用してインターネット IP を取得できます。しかし、ゲートウェイの IP を特定するにはどうすればよいでしょうか?

方法を知っていれば、これは .NET ではやや簡単です。しかし、Java でどのように行うのでしょうか。

4

16 に答える 16

24

Windows、OSX、Linuxなどでは、Chris Bunchの答えは、

netstat -rn

tracerouteコマンドの代わりに。

ゲートウェイの IP アドレスは、defaultまたはで始まる行の 2 番目のフィールドに表示されます0.0.0.0

これにより、 を使用しようとする際の多くの問題が回避されますtraceroute

  1. Windows ではtraceroute実際にはtracert.exeであるため、コードに O/S の依存関係は必要ありません。
  2. これは簡単に実行できるコマンドです。ネットワークからではなく、O/S から情報を取得します。
  3. traceroute時々ネットワークによってブロックされます

netstat唯一の欠点は、出力が複数行になるため、正しい行が見つかるまで出力から行を読み続ける必要があることです。

編集:デフォルト ゲートウェイの IP アドレスは、MAC を使用している場合 (Lion でテスト済み)、「default」で始まる行の 2 番目のフィールド、または「0.0.0.0」で始まる行の 3 番目のフィールドにあります ( Windows 7 でテスト済み)

ウィンドウズ:

ネットワーク宛先ネットマスク ゲートウェイ インターフェイス メトリック

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

マック:

宛先ゲートウェイ フラグ 参照は Netif Expire を使用

デフォルト 192.168.2.254 UGSc 104 4 en1

于 2008-10-29T15:21:25.580 に答える
12

残念ながら、Java は他の言語ほど快適ではありません。これが私がしたことです:

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

これは、ゲートウェイが 2 番目のトークンであり、3 番目のトークンではないことを前提としています。st.nextToken();そうである場合は、トークナイザーをもう 1 つ進めるためにエクストラを追加する必要があります。

于 2008-08-15T06:38:21.813 に答える
5

Windows では、IPConfig の出力を解析すると、トレースを待たずにデフォルト ゲートウェイが取得されます。

于 2008-09-14T12:54:43.780 に答える
4
    try{
        String gateway;
        Process result = Runtime.getRuntime().exec("netstat -rn");

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

        String line = output.readLine();
        while(line != null){
            if ( line.trim().startsWith("default") == true || line.trim().startsWith("0.0.0.0") == true )
                break;      
            line = output.readLine();
        }
        if(line==null) //gateway not found;
            return;

        StringTokenizer st = new StringTokenizer( line );
        st.nextToken();
        st.nextToken();
        gateway = st.nextToken();
        System.out.println("gateway is: "+gateway);


    } catch( Exception e ) { 
        System.out.println( e.toString() );
        gateway = new String();
        adapter = new String();
    }
于 2008-10-29T19:52:22.163 に答える
2

UPnPについて:すべてのルーターがUPnPをサポートしているわけではないことに注意してください。そして、もしそうなら、それは(セキュリティ上の理由で)オフにされる可能性があります。したがって、ソリューションが常に機能するとは限りません。

また、NatPMPもご覧ください。

UPnPの簡単なライブラリはhttp://miniupnp.free.fr/にありますが、C言語では...

于 2008-09-05T21:42:54.303 に答える
2

netstat -rn の出力はロケール固有です。私のシステム (locale=de) では、出力は次のようになります: ... Standardgateway: 10.22.0.1

そのため、「default」で始まる行はありません。

そのため、netstat を使用することはお勧めできません。

于 2009-04-23T10:58:39.517 に答える
2

traceroute (ICMP ベースの広域ヒット) で言及されている問題を克服するには、次のことを検討してください。

  1. パブリック IP への traceroute (広域ヒットを回避しますが、それでも ICMP)
  2. ifconfig/ipconfig のような非 ICMP ユーティリティを使用します (ただし、これには移植性の問題があります)。
  3. 現時点で最も移植性の高い最適なソリューションと思われるのは、netstat をシェル化して解析することです (コード例はこちらを参照してください) 。
于 2008-09-14T11:51:59.797 に答える
2

このバージョンは、www.whatismyip.com に接続し、サイトのコンテンツを読み取り、正規表現を使用して IP アドレスを検索し、それを cmd に出力します。その 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();
            }
        }
    }
}
于 2012-01-25T15:46:50.010 に答える
2

checkmyip.org のようなものを使用した方がよい場合があります。これは、パブリック IP アドレスを決定します (最初のホップ ルーターである必要はありません)。Uni では「実際の」IP アドレスを持っていますが、自宅ではローカル ルーターのパブリック IP アドレスです。

返されたページを解析するか、IP アドレスを唯一の文字列として取得できる別のサイトを見つけることができます。

(つまり、この URL を Java などで読み込んで、必要な情報を取得するという意味です)。

これは完全にプラットフォームに依存しないはずです。

于 2008-08-15T06:15:16.823 に答える
1

それは思ったほど簡単ではありません。Java はプラットフォームに依存しないため、Java で行う方法がわかりません。私は、.NET がそれを報告する Web サイトに連絡していると推測しています。いくつかの方法があります。まず、ICMP プロトコルを詳しく調べると、必要な情報が得られる場合があります。経由する IP (ルート) をトレースすることもできます。次の範囲にない IP に遭遇した場合:

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

それはあなたのものから 1 ホップ離れた IP であり、おそらく数オクテットの情報をあなたの IP と共有します。

幸運を祈ります。この質問に対する決定的な答えを知りたいです。

于 2008-08-15T03:49:48.800 に答える
1

持っている場合は、traceroute にアクセスしてみてください。

「traceroute -m 1 www.amazon.com」は、次のようなメッセージを出力します。

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

2 行目を解析します。はい、それは醜いですが、誰かがより良いものを投稿するまで、それはあなたを動かすでしょう.

于 2008-08-15T04:25:23.160 に答える
1

マシュー: はい、それが「Web サイトのサービスを使用してインターネット IP を取得できる」という意味です。口下手でごめんなさい。

Brian/Nick: これらのルーターの多くは ICMP が無効になっているため、常に停止するという事実を除けば、Traceroute は問題ありません。

traceroute と uPnP の組み合わせがうまくいくと思います。それが私がやろうとしていたことであり、明らかな何かが欠けていることを望んでいました。

皆さんのコメントに感謝します。明らかなことは何も見逃していないように思えます。ゲートウェイを検出するために、いくつかの uPnP の実装を開始しました。

于 2008-08-15T06:31:38.100 に答える
1

netstat -rnWindows、OSX、Linux などのプラットフォームで利用可能なコマンドを使用できます。これが私のコードです:

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
于 2016-04-17T17:24:23.343 に答える
1

URL " http://whatismyip.com/automation/n09230945.asp "を照会できます。例えば:

    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();
        }
    }
于 2008-11-08T18:05:28.783 に答える