Как я могу определить IP моего маршрутизатора/шлюза в Java? Я могу получить свой IP достаточно легко. Я могу получить IP своего Интернета, используя сервис на веб-сайте. Но как я могу определить IP моего шлюза?
В .NET это довольно просто, если вы знаете, как это сделать. Но как это сделать в Java?
На Windows, OSX, Linux, и т.д. тогда Крисе Bunch' s ответ может быть очень улучшен при помощи
netstat -rn
вместо команды 'traceroute'.
Ваш gateway' s IP-адрес появится во второй области линии, которая начинает или 'дефолт' или '0.0.0.0'.
Это обходит много проблем с попыткой использовать 'traceroute':
Единственный недостаток - то, что будет необходимо продолжать читать линии от продукции 'netstat', пока правильная линия не будет найдена, с тех пор there' ll быть больше чем одной линией продукции.
ОТРЕДАКТИРУЙТЕ: Дефолт Gateway' s IP-адрес находится во второй области линии, которая начинается с ' default' если Вы находитесь на MAC (проверены на Льве), или в третья область линии, которая начинается с ' 0.0.0.0' (проверенный на Windows 7)
Windows:
сетевое место назначения метрика интерфейса ворот Netmask
0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10
Mac:
использование судей флагов ворот назначения Netif истекает
дефолт 192.168.2.254 UGSc 104 4 en1
Ява doesn' t делают это столь же приятным как другие языки, к сожалению. Here' s, что я сделал:
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 ()'; продвинуть tokenizer еще одно пятно.
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();
}
продукция netstat-rn является конкретным местом действия. на моей системе (locale=de) продукция похож: ... Standardgateway: 10.22.0.1
таким образом, нет никакой линии, начинающейся с ' default'.
так использование netstat не могло бы быть никакой хорошей идеей.
Преодолеть проблемы упомянуло с traceroute (основанный на ICMP, широкий хит области), Вы могли рассмотреть:
[1]: http://forums.sun.com/thread.jspa? threadID=5289135
Возможно, вам лучше использовать что-то вроде checkmyip.org, который определит ваш публичный IP-адрес - не обязательно вашего маршрутизатора первого хопа: в Uni у меня есть "реальный" IP-адрес, в то время как дома это мой локальный маршрутизатор'публичный IP-адрес.
Вы можете разобрать страницу, которая возвращается, или найти другой сайт, который позволяет вам просто получить IP-адрес в качестве единственной строки.
(Я имею в виду загрузить этот URL в Java/что угодно, а затем получить нужную информацию).
Это должно быть полностью независимым от платформы.
Относительно UPnP: знайте, что не все маршрутизаторы поддерживают UPnP. И если они делают это могло бы быть выключено (из соображений безопасности). Таким образом, Ваше решение не могло бы всегда работать.
Вы должны также взглянуть на NatPMP.
Простая библиотека для UPnP может быть найдена в http://miniupnp.free.fr/, хотя it' s в C...
Эта Версия соединяется с 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();
}
}
}
}
Это не так просто, как кажется. Java не зависит от платформы, поэтому я не уверен, как это сделать в Java. Я догадываюсь, что .NET связывается с каким-то веб-сайтом, который сообщает об этом. Есть несколько путей. Во-первых, более глубокое изучение протокола ICMP может дать вам необходимую информацию. Вы также можете отследить IP, через который вы проходите (ваш маршрут). Когда вы встречаете IP, который не входит в следующие диапазоны:
это 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
Разберите вторую строку. Да, это уродливо, но это поможет вам, пока кто-нибудь не напишет что-нибудь более красивое.
Мэтью: Да, именно это я подразумевал под " я могу получить свой интернет-IP использование обслуживания на веб-сайте " Извините за то, чтобы быть бойким.
Brian/Nick: Traceroute был бы прекрасен за исключением того, что большому количеству этих маршрутизаторов искалечили ICMP, и таким образом это всегда останавливается.
Я думаю, комбинация traceroute и uPnP удастся. Именно это я был планированием выполнения, я как просто надежда, что я пропускал что-то очевидное.
Поблагодарите Вас все за свои комментарии, таким образом, это походит на I' m не пропускающий что-либо очевидное. Я начал осуществлять некоторые части uPnP, чтобы обнаружить ворота.
Вы можете подвергнуть сомнению 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();
}
}
В окнах Вы можете просто использовать следующую команду:
ipconfig | findstr /i "Gateway"
Который даст Вам продукцию как:
Default Gateway . . . . . . . . . : 192.168.2.1
Default Gateway . . . . . . . . . : ::
Однако я can' t управляют этой командой с Явой, собираясь почта, когда я понимаю это.
Вы можете использовать '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
I' m не уверенный, если это работает над каждой системой, но по крайней мере здесь, я нашел это:
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];
}
}
}
Для меня это производит:
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
I' d требуют, чтобы больше тестов на другом Systems/Configurations/PC-Gateway-Setups подтвердило, работает ли он везде. Вид сомнения это, но это было первым, я нашел.