Сведения о вопросе

NOTtoday

08:47, 5th August, 2020

Теги

java   sockets   ip   router    

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

Просмотров: 600   Ответов: 16

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

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



  Сведения об ответе

COOL

18:28, 4th August, 2020

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

netstat -rn

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

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

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

  1. на Windows traceroute на самом деле является tracert.exe , поэтому нет необходимости в O/S зависимостях в коде
  2. это быстрая команда для запуска - она получает информацию из O/S,, а не из сети
  3. 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


  Сведения об ответе

ASER

20:42, 16th August, 2020

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


  Сведения об ответе

qwerty101

22:01, 27th August, 2020

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();
}


  Сведения об ответе

qwerty101

02:04, 12th August, 2020

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


  Сведения об ответе

VERSUION

14:36, 7th August, 2020

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

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

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

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


  Сведения об ответе

davran

02:31, 6th August, 2020

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

Вы также должны посмотреть на NatPMP.

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


  Сведения об ответе

VERSUION

15:34, 18th August, 2020

Чтобы преодолеть проблемы, упомянутые с traceroute (ICMP-based, wide area hit), вы можете рассмотреть:

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


  Сведения об ответе

lourence

06:46, 27th August, 2020

выход netstat-rn является locale специфичным. в моей системе (locale=de) вывод выглядит следующим образом: ... Standardgateway: 10.22.0.1

таким образом, нет строки, начинающейся с 'default'.

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


  Сведения об ответе

padenie

22:25, 27th August, 2020

Эта версия подключается к 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();
            }
        }
    }
}


  Сведения об ответе

dumai

19:24, 21st August, 2020

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

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


  Сведения об ответе

прога

02:27, 15th August, 2020

Попробуйте обстрелять трассу 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

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


  Сведения об ответе

PROGA

07:04, 19th August, 2020

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

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

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

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


  Сведения об ответе

davran

04:44, 19th August, 2020

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


  Сведения об ответе

PIRLO

17:03, 26th August, 2020

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

ipconfig | findstr /i "Gateway"

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

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

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


  Сведения об ответе

baggs

02:21, 8th August, 2020

Вы можете использовать команду 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


  Сведения об ответе

darknet

02:41, 20th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться