Вопрос:

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

java sockets ip router

26547 просмотра

16 ответа

44719 Репутация автора

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

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

Автор: Frank Krueger Источник Размещён: 15.08.2008 03:32

Ответы (16)


1 плюс

521 Репутация автора

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

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

Автор: Brian Размещён: 15.08.2008 03:49

1 плюс

1191 Репутация автора

Попробуй выложить в 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

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

Автор: Nick Brosnahan Размещён: 15.08.2008 04:25

2 плюса

27426 Репутация автора

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

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

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

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

Автор: Matthew Schinckel Размещён: 15.08.2008 06:15

1 плюс

44719 Репутация автора

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

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

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

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

Автор: Frank Krueger Размещён: 15.08.2008 06:31

10 плюса

59348 Репутация автора

Решение

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

Автор: Chris Bunch Размещён: 15.08.2008 06:38

2 плюса

2890 Репутация автора

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

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

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

Автор: akr Размещён: 05.09.2008 09:42

2 плюса

12563 Репутация автора

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

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

3 плюса

4723 Репутация автора

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

Автор: bruceatk Размещён: 14.09.2008 12:54

23 плюса

271424 Репутация автора

В 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

Автор: Alnitak Размещён: 29.10.2008 03:21

4 плюса

176 Репутация автора

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();
}
Автор: Hamza Yerlikaya Размещён: 29.10.2008 07:52

1 плюс

0 Репутация автора

Вы можете запросить 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();
        }
    }
Автор: MosheElisha Размещён: 08.11.2008 06:05

2 плюса

0 Репутация автора

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

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

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

Автор: Andreas Schoelver Размещён: 23.04.2009 10:58

2 плюса

21 Репутация автора

Эта версия подключается к 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();
            }
        }
    }
}
Автор: Loki Nightray Размещён: 25.01.2012 03:46

1 плюс

593 Репутация автора

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

ipconfig | findstr /i "Gateway"

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

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

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

Автор: ZZ 5 Размещён: 27.12.2013 07:01

1 плюс

226 Репутация автора

Вы можете использовать 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
Автор: chandan Размещён: 17.04.2016 05:24

0 плюса

1 Репутация автора

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

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

Автор: PCK4D Размещён: 14.02.2019 10:12
Вопросы из категории :
32x32