Java でルーター/ゲートウェイの IP を特定するにはどうすればよいですか? IP は簡単に取得できます。Web サイトのサービスを使用してインターネット IP を取得できます。しかし、ゲートウェイの IP を特定するにはどうすればよいでしょうか?
方法を知っていれば、これは .NET ではやや簡単です。しかし、Java でどのように行うのでしょうか。
Windows、OSX、Linuxなどでは、Chris Bunchの答えは、
netstat -rn
traceroute
コマンドの代わりに。
ゲートウェイの IP アドレスは、default
またはで始まる行の 2 番目のフィールドに表示されます0.0.0.0
。
これにより、 を使用しようとする際の多くの問題が回避されますtraceroute
。
traceroute
実際にはtracert.exe
であるため、コードに O/S の依存関係は必要ありません。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
残念ながら、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 つ進めるためにエクストラを追加する必要があります。
Windows では、IPConfig の出力を解析すると、トレースを待たずにデフォルト ゲートウェイが取得されます。
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();
}
UPnPについて:すべてのルーターがUPnPをサポートしているわけではないことに注意してください。そして、もしそうなら、それは(セキュリティ上の理由で)オフにされる可能性があります。したがって、ソリューションが常に機能するとは限りません。
また、NatPMPもご覧ください。
UPnPの簡単なライブラリはhttp://miniupnp.free.fr/にありますが、C言語では...
netstat -rn の出力はロケール固有です。私のシステム (locale=de) では、出力は次のようになります: ... Standardgateway: 10.22.0.1
そのため、「default」で始まる行はありません。
そのため、netstat を使用することはお勧めできません。
traceroute (ICMP ベースの広域ヒット) で言及されている問題を克服するには、次のことを検討してください。
このバージョンは、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();
}
}
}
}
checkmyip.org のようなものを使用した方がよい場合があります。これは、パブリック IP アドレスを決定します (最初のホップ ルーターである必要はありません)。Uni では「実際の」IP アドレスを持っていますが、自宅ではローカル ルーターのパブリック IP アドレスです。
返されたページを解析するか、IP アドレスを唯一の文字列として取得できる別のサイトを見つけることができます。
(つまり、この URL を Java などで読み込んで、必要な情報を取得するという意味です)。
これは完全にプラットフォームに依存しないはずです。
それは思ったほど簡単ではありません。Java はプラットフォームに依存しないため、Java で行う方法がわかりません。私は、.NET がそれを報告する Web サイトに連絡していると推測しています。いくつかの方法があります。まず、ICMP プロトコルを詳しく調べると、必要な情報が得られる場合があります。経由する IP (ルート) をトレースすることもできます。次の範囲にない IP に遭遇した場合:
それはあなたのものから 1 ホップ離れた IP であり、おそらく数オクテットの情報をあなたの IP と共有します。
幸運を祈ります。この質問に対する決定的な答えを知りたいです。
持っている場合は、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 行目を解析します。はい、それは醜いですが、誰かがより良いものを投稿するまで、それはあなたを動かすでしょう.
マシュー: はい、それが「Web サイトのサービスを使用してインターネット IP を取得できる」という意味です。口下手でごめんなさい。
Brian/Nick: これらのルーターの多くは ICMP が無効になっているため、常に停止するという事実を除けば、Traceroute は問題ありません。
traceroute と uPnP の組み合わせがうまくいくと思います。それが私がやろうとしていたことであり、明らかな何かが欠けていることを望んでいました。
皆さんのコメントに感謝します。明らかなことは何も見逃していないように思えます。ゲートウェイを検出するために、いくつかの uPnP の実装を開始しました。
netstat -rn
Windows、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
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();
}
}