Как определить 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