Как определить IP-адрес моего маршрутизатора/шлюза в Java?
Как определить IP-адрес моего маршрутизатора/шлюза в Java? Я могу получить свой IP достаточно легко. Я могу получить свой интернет-IP, используя услугу на веб-сайте. Но как я могу определить IP-адрес шлюза?
Это довольно просто в .NET, если вы знаете свой путь. Но как вы это делаете в Java?
Ответы
Ответ 1
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);
}
}
Это предполагает, что шлюз является вторым токеном, а не третьим. Если это так, вам нужно добавить дополнительный st.nextToken();
, чтобы продвинуть токенизатор еще на одно место.
Ответ 2
В Windows, OSX, Linux и т.д. ответ Криса Бунка может быть значительно улучшен с помощью
netstat -rn
вместо команды traceroute
.
Ваш IP-адрес шлюза появится во втором поле строки, которое начинается либо с default
, либо 0.0.0.0
.
Это связано с рядом проблем с попыткой использовать traceroute
:
- в Windows
traceroute
на самом деле tracert.exe
, поэтому нет необходимости в зависимостях O/S в коде
- это быстрая команда для запуска - она получает информацию от O/S, а не из сети
-
traceroute
иногда блокируется сетью
Единственный недостаток заключается в том, что необходимо будет продолжать считывать строки с выхода netstat
до тех пор, пока не будет найдена правильная строка, так как будет более одной строки вывода.
EDIT: IP-адрес шлюза по умолчанию находится во втором поле строки, которое начинается с "по умолчанию", если вы находитесь на MAC (тестируется на Lion) или в третьем поле строки, которая начинается с "0.0.0.0" (проверена на Windows 7).
Окна:
Сетевой макет Шлюз интерфейса сетевой карты
0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10
Mac:
Флаги целевого шлюза Refs Используйте Netif Expire
default 192.168.2.254 UGSc 104 4 ru1
Ответ 3
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();
}
Ответ 4
При анализе окон вывод IPConfig доставит вам шлюз по умолчанию, не дожидаясь трассировки.
Ответ 5
Возможно, вам лучше использовать что-то вроде checkmyip.org, которое определит ваш общедоступный IP-адрес - не обязательно ваш первый маршрутизатор с переходом: у Uni у меня есть "настоящий" IP-адрес, тогда как дома это мой локальный маршрутизатор IP-адрес.
Вы можете проанализировать возвращаемую страницу или найти другой сайт, который позволит вам просто вернуть IP-адрес в качестве единственной строки.
(Я имею в виду загрузить этот URL-адрес в Java/независимо, а затем получить нужную информацию).
Это должно быть полностью независимым от платформы.
Ответ 6
Что касается UPnP: имейте в виду, что не все маршрутизаторы поддерживают UPnP. И если они это сделают, это может быть отключено (по соображениям безопасности). Поэтому ваше решение может не всегда работать.
Вы также должны посмотреть на NatPMP.
Простую библиотеку для UPnP можно найти в http://miniupnp.free.fr/, хотя она в C...
Ответ 7
Чтобы преодолеть проблемы, упомянутые в traceroute (ICMP-based, широкий удар), вы можете подумать:
- traceroute для вашего общедоступного IP (избегает широкомасштабного хита, но все еще ICMP)
- Используйте не-ICMP-утилиту, например ifconfig/ipconfig (проблемы с переносимостью с этим).
- На данный момент лучшим и самым портативным решением является оболочка и анализ netstat (см. пример кода здесь)
Ответ 8
вывод netstat -rn специфичен для локали.
в моей системе (locale = de) вывод выглядит следующим образом:
...
Standardgateway: 10.22.0.1
поэтому нет строки, начинающейся с "default".
поэтому использование netstat может быть не очень хорошей идеей.
Ответ 9
Эта версия подключается к 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();
}
}
}
}
Ответ 10
Это не так просто, как кажется. Java не зависит от платформы, поэтому я не уверен, как это сделать на Java. Я предполагаю, что .NET связывается с каким-то веб-сайтом, который сообщает об этом. Есть пара способов пойти. Во-первых, более глубокий взгляд на протокол 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
это IP-адрес от вашего хопа и, возможно, имеет несколько октетов информации с вашим IP-адресом.
Удачи. Мне будет интересно услышать окончательный ответ на этот вопрос.
Ответ 11
Попробуйте обрезать 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
Разбор второй строки. Да, это уродливо, но это заставит вас идти, пока кто-то не напишет что-нибудь приятнее.
Ответ 12
Мэтью: Да, это то, что я имел в виду под "Я могу получить свой интернет-IP, используя услугу на веб-сайте". Извините, что я был близок.
Брайан/Ник: Traceroute будет прекрасен, за исключением того факта, что у многих из этих маршрутизаторов отключен ICMP, и поэтому он всегда останавливается.
Я думаю, что комбинация traceroute и uPnP будет работать. Это то, что я планировал делать, я просто надеялся, что я упустил что-то очевидное.
Спасибо всем за ваши комментарии, так что звучит так, будто я ничего не теряю. Я начал внедрять некоторые бит uPnP, чтобы обнаружить шлюз.
Ответ 13
Вы можете запросить 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();
}
}
Ответ 14
В окнах вы можете просто использовать следующую команду:
ipconfig | findstr /i "Gateway"
Что даст вам вывод, например:
Default Gateway . . . . . . . . . : 192.168.2.1
Default Gateway . . . . . . . . . : ::
Однако я не могу запустить эту команду с Java, собираюсь опубликовать ее, когда я это понял.
Ответ 15
Вы можете использовать команду 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