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

голоса
14

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

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

Задан 15/08/2008 в 04:32
источник пользователем
На других языках...                            


15 ответов

голоса
23

В операционной системе 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 - адрес шлюза находится во втором поле строки , которая начинается с « по умолчанию» , если вы находитесь на MAC (протестировано на Lion), или в третьем поле строки , которая начинается с «0.0.0.0» ( протестирована на Windows 7)

Окна:

Сеть назначения Netmask Gateway Interface Metric

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

Mac:

Направление Шлюз Флаги Refs Использование Netif Expire

по умолчанию 192.168.2.254 ЕГСК 104 4 en1

Ответил 29/10/2008 в 16:21
источник пользователем

голоса
9

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 еще одну точки.

Ответил 15/08/2008 в 07:38
источник пользователем

голоса
4
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();
}
Ответил 29/10/2008 в 20:52
источник пользователем

голоса
3

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

Ответил 14/09/2008 в 13:54
источник пользователем

голоса
2

Эта версия подключается к www.whatismyip.com, считывает содержимое сайта и поиск с помощью регулярных выражений IP-адрес и выводит его на ЦМД. Его небольшое улучшение 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();
            }
        }
    }
}
Ответил 25/01/2012 в 16:46
источник пользователем

голоса
2

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

так что нет никакой линии, начиная с «по умолчанию».

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

Ответил 23/04/2009 в 11:58
источник пользователем

голоса
2

Для того, чтобы преодолеть проблемы, упомянутые в трассировке (ICMP на основе глобальной хит) вы могли бы рассмотреть следующие вопросы:

  1. трассировка на общедоступный IP (избегает широкой области удара, но по-прежнему ICMP)
  2. Используйте утилиту без ICMP, как IFCONFIG / Ipconfig (вопросы портативность с этим, хотя).
  3. То , что кажется самым лучшим и самым портативным решением для теперь раскошелиться и разобрать NetStat (смотри пример кода здесь )
Ответил 14/09/2008 в 12:51
источник пользователем

голоса
2

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

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

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

Ответил 05/09/2008 в 22:42
источник пользователем

голоса
2

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

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

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

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

Ответил 15/08/2008 в 07:15
источник пользователем

голоса
1

Вы можете использовать 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
Ответил 17/04/2016 в 17:24
источник пользователем

голоса
1

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

ipconfig | findstr /i "Gateway"

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

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

Однако я не могу запустить эту команду с Java, собирающийся пост, когда я это цифра.

Ответил 27/12/2013 в 20:01
источник пользователем

голоса
1

Вы можете запросить 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();
        }
    }
Ответил 08/11/2008 в 19:05
источник пользователем

голоса
1

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

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

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

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

Ответил 15/08/2008 в 07:31
источник пользователем

голоса
1

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

«Трассировку -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

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

Ответил 15/08/2008 в 05:25
источник пользователем

голоса
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.

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

Ответил 15/08/2008 в 04:49
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more