Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как я могу определить IP моего маршрутизатора / шлюза в Java?
Как я могу определить IP моего маршрутизатора / шлюза в Java? Я могу получить свой IP достаточно легко. Я могу получить свой internet IP, используя услугу на веб-сайте. Но как я могу определить IP моего шлюза?
Это довольно легко в .NET, если вы знаете свой путь вокруг. Но как это сделать в Java году?
На 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-адрес шлюза по умолчанию находится во втором поле строки, начинающейся с 'default', если вы находитесь на MAC (проверено на Lion), или в третьем поле строки, начинающейся с '0.0.0.0' (проверено на Windows 7)
Windows:
Сети Маска Сети Назначения Шлюза Интерфейс Метрика
0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10
Мак:
Шлюз Назначения Флаги Refs Use Netif Истекают
по умолчанию 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);
}
}
Это предполагает, что шлюз является вторым маркером, а не третьим. Если это так, вам нужно добавить дополнительный st.nextToken(); , чтобы продвинуть токенизатор еще на одно место.
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();
}
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();
}
Возможно, Вам будет лучше использовать что - то вроде checkmyip.org, которое определит ваш публичный адрес IP-не обязательно ваш первый маршрутизатор прыжка: в Uni у меня есть адрес "real" IP, тогда как дома это публичный адрес моего локального маршрутизатора IP.
Вы можете проанализировать возвращаемую страницу или найти другой сайт, который позволяет вам просто получить адрес IP как единственную строку.
(Я имею в виду загрузить этот URL в Java/whatever,, а затем получить необходимую информацию).
Это должно быть полностью независимым от платформы.
Что касается UPnP: имейте в виду, что не все маршрутизаторы поддерживают UPnP. И если они это сделают, то могут быть отключены (по соображениям безопасности). Так что ваше решение может не всегда работать.
Вы также должны посмотреть на NatPMP.
Простая библиотека для UPnP может быть найдена в http://miniupnp.free.fr/, хотя она находится в C...
Чтобы преодолеть проблемы, упомянутые с traceroute (ICMP-based, wide area hit), вы можете рассмотреть:
- traceroute к вашей публике IP (избегает попадания в широкую область, но все же ICMP)
- Используйте утилиту не ICMP, такую как ifconfig/ipconfig (хотя с этим возникают проблемы переносимости).
- На данный момент лучшим и наиболее переносимым решением является shell & синтаксический анализ netstat (см. Пример кода здесь )
Эта версия подключается к 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 может дать вам необходимую информацию. Вы также можете trace 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.
Желаю удачи. Мне будет любопытно услышать окончательный ответ на этот вопрос.
Попробуйте обстрелять трассу 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 сработает. Это то, что я планировал сделать, я просто надеялся, что упустил что-то очевидное.
Спасибо всем за ваши комментарии, так что, похоже, я не упускаю ничего очевидного. Я начал реализовывать некоторые биты 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();
}
}
Вы можете использовать команду 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
Я не уверен, что это работает на каждой системе, но, по крайней мере, здесь я нашел это:
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
Я бы потребовал больше тестов на других Systems/Configurations/PC-Gateway-Setups, чтобы подтвердить, работает ли он везде. Вроде бы сомневаюсь, но это было первое, что я нашел.