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

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

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

Ответы [ 16 ]

1 голос
/ 27 декабря 2013

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

ipconfig | findstr /i "Gateway"

Что даст вам вывод как:

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

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

1 голос
/ 08 ноября 2008

Вы можете запросить 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 голос
/ 15 августа 2008

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

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

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

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

1 голос
/ 15 августа 2008

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

'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 августа 2008

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

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

0 голосов
/ 15 февраля 2019

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

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, чтобы подтвердить, работает ли он везде. Вроде сомневаюсь, но это было первое, что я нашел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...