Как я могу определить IP моего маршрутизатора / шлюза в Java?

Как я могу определить IP моего маршрутизатора / шлюза в Java? Я могу получить свой IP достаточно легко. Я могу получить свой интернет-IP с помощью службы на веб-сайте. Но как я могу определить IP своего шлюза?

Это немного просто в .NET, если вы знаете, как обходиться. Но как вы делаете это на Java?

15.08.2008 03:32:28
Ваш шлюз / маршрутизатор фактически имеет (как минимум) два IP-адреса. Вы ищете тот, который обращен к вашему узлу, или другой (ие) обращен вверх по направлению к другим сетям?
Tall Jeff 14.09.2008 12:26:28
16 ОТВЕТОВ
РЕШЕНИЕ

К сожалению, 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();чтобы продвинуть токенизатор еще на одну точку.

11
15.08.2008 06:38:21
На самом деле это не работает для Windows-OS, так как traceroute там называется tracert.
Thorbjørn Ravn Andersen 22.06.2010 14:38:35

Это не так просто, как кажется. 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-адресом.

Удачи. Мне было бы интересно услышать окончательный ответ на этот вопрос.

1
15.08.2008 03:49:48

Попробуй обстреливать трассировку, если она у тебя есть.

'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

Разбираем вторую строку. Да, это некрасиво, но это поможет вам, пока кто-нибудь не напишет что-то более приятное.

1
15.08.2008 04:25:23

Возможно, вам лучше использовать что-то вроде checkmyip.org, который будет определять ваш публичный IP-адрес - не обязательно ваш маршрутизатор первого прыжка: в Uni у меня есть «реальный» IP-адрес, тогда как дома это публичный IP-адрес моего локального маршрутизатора.

Вы можете проанализировать возвращаемую страницу или найти другой сайт, который позволяет вам просто вернуть IP-адрес в качестве единственной строки.

(Я имею в виду загрузить этот URL в Java / что угодно, а затем получить необходимую информацию).

Это должно быть полностью независимым от платформы.

2
15.08.2008 06:15:16

Мэтью: Да, это то, что я имел в виду под «я могу получить свой интернет-IP, используя сервис на сайте». Извините, что был бойким.

Брайан / Ник: Traceroute будет в порядке, за исключением того факта, что на многих из этих маршрутизаторов отключен протокол ICMP, и поэтому он всегда останавливается.

Я думаю, что комбинация traceroute и uPnP сработает. Это то, что я планировал сделать, я просто надеялся, что упустил что-то очевидное.

Спасибо всем за ваши комментарии, так что, похоже, я не упускаю ничего очевидного. Я начал реализовывать некоторые биты uPnP, чтобы обнаружить шлюз.

1
15.08.2008 06:34:49

Что касается UPnP: имейте в виду, что не все маршрутизаторы поддерживают UPnP. И если они это сделают, это может быть отключено (по соображениям безопасности). Так что ваше решение может не всегда работать.

Вы также должны взглянуть на NatPMP.

Простую библиотеку для UPnP можно найти по адресу http://miniupnp.free.fr/ , хотя она находится в C ...

2
5.09.2008 21:42:54

Чтобы преодолеть проблемы, упомянутые с traceroute (основанный на ICMP, охват всей области), вы можете рассмотреть следующие вопросы:

  1. traceroute к вашему общедоступному IP-адресу (избегает широкого охвата, но все же ICMP)
  2. Используйте не ICMP-утилиту, такую ​​как ifconfig / ipconfig (с этим проблемы переносимости).
  3. Лучшим и наиболее переносимым решением на данный момент является shell & parts netstat (см. Пример кода здесь )
2
14.09.2008 11:51:59

При разборе Windows вывод IPConfig даст вам шлюз по умолчанию, не дожидаясь трассировки.

4
14.09.2008 12:54:43

В Windows, OSX, Linux и т. Д. Ответ Криса Банча может быть значительно улучшен с помощью

netstat -rn

вместо tracerouteкоманды.

IP - адрес шлюза появится во втором поле строки , которая начинается либо defaultили 0.0.0.0.

Это позволяет обойти ряд проблем при попытке использовать traceroute:

  1. на tracerouteсамом деле в Windows tracert.exe, поэтому нет необходимости в O / S-зависимостях в коде
  2. это быстрая команда для запуска - она ​​получает информацию из O / S, а не из сети
  3. traceroute иногда блокируется сетью

Единственным недостатком является то, что будет необходимо сохранять строки чтения из netstatвывода, пока не будет найдена правая строка, поскольку будет более одной строки вывода.

РЕДАКТИРОВАТЬ: 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:

Флаги шлюза назначения Ссылки Использовать Netif Expire

по умолчанию 192.168.2.254 UGSc 104 4 en1

23
24.07.2012 14:28:01
    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();
    }
4
12.03.2020 09:33:20
Линия может также начать с 0.0.0.0вместоdefault
Alex Abdugafarov 12.10.2015 02:44:40

Вы можете запросить 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();
        }
    }
1
8.11.2008 18:05:28

вывод netstat -rn зависит от локали. в моей системе (locale = de) вывод выглядит так: ... Standardgateway: 10.22.0.1

поэтому нет строки, начинающейся с 'default'.

поэтому использование netstat может быть не очень хорошей идеей.

2
23.04.2009 10:58:39
что это за ОС? На OSX нет никакой разницы в локали в выводе.
Alnitak 23.04.2009 11:07:52

Эта версия подключается к www.whatismyip.com, читает содержимое сайта и выполняет поиск по IP-адресу с помощью регулярных выражений и печатает его в cmd. Это небольшое улучшение кода Моше Элишаса

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();
            }
        }
    }
}
2
25.01.2012 15:46:50

В окнах вы можете просто использовать следующую команду:

ipconfig | findstr /i "Gateway"

Который даст вам вывод, как:

Default Gateway . . . . . . . . . : 192.168.2.1
Default Gateway . . . . . . . . . : ::

Однако я не могу запустить эту команду с Java, буду публиковать, когда я это выясню.

1
27.12.2013 19:01:17

Вы можете использовать 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
1
17.04.2016 18:18:01

Я не уверен, работает ли это на каждой системе, но по крайней мере здесь я нашел это:

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

Я бы потребовал больше тестов на других Системах / Конфигурациях / PC-Gateway-Setups, чтобы подтвердить, работает ли он везде. Вроде сомневаюсь, но это было первое, что я нашел.

0
14.02.2019 22:12:52