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

Как я могу определить IP моего маршрутизатора / шлюза в Java? I can get my IP easily enough. I can get my internet IP using a service on a website. Но как определить IP шлюза?

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

16 ответов

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

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

  2. Попробуйте обстреливать traceroute, если у вас есть.

    ‘traceroute-m 1 http://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
    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. На Windows, OSX, Linux и т.д. Затем ответ Chris Bunch может быть значительно улучшен с помощью

    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:

    Метрика Интерфейса Шлюза Netmask Назначения Сети

    0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

    Mac:

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

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

  10. 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();
    }
    
  11. Вы можете запросить 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();
            }
        }
    
  12. выход netstat-rn зависит от локали.
    в моей системе (locale=de) выходные данные выглядят так:

    Standardgateway: 10.22.0.1

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

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

  13. Эта версия подключается к http://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();
                }
            }
        }
    }
    
  14. В windows можно просто использовать следующую команду:

    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
    
  16. Я не уверен, работает ли он на каждой системе, но, по крайней мере, здесь я нашел это:

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