Как использовать ICMP и трассировку в Java

В Java нет примитивов для ICMP и traceroute. Как это преодолеть? По сути, я создаю код, который должен работать в * nix и Windows, и мне нужен фрагмент кода, который будет работать на обеих платформах.


person Ricardo    schedule 13.04.2010    source источник


Ответы (2)


Вот что я написал сегодня, чтобы «реализовать» команду трассировки маршрута в Java. Я тестировал только в Windows, но он должен работать и в Linux, хотя есть несколько инструментов traceroute, доступных для Linux, поэтому, скорее всего, должны быть некоторые проверки существования этих программ.

public class NetworkDiagnostics{
  private final String os = System.getProperty("os.name").toLowerCase();

  public String traceRoute(InetAddress address){
    String route = "";
    try {
        Process traceRt;
        if(os.contains("win")) traceRt = Runtime.getRuntime().exec("tracert " + address.getHostAddress());
        else traceRt = Runtime.getRuntime().exec("traceroute " + address.getHostAddress());

        // read the output from the command
        route = convertStreamToString(traceRt.getInputStream());

        // read any errors from the attempted command
        String errors = convertStreamToString(traceRt.getErrorStream());
        if(errors != "") LOGGER.error(errors);
    }
    catch (IOException e) {
        LOGGER.error("error while performing trace route command", e);
    }

    return route;
}
person carlin.scott    schedule 22.01.2013
comment
Условие следует изменить на os.toLowerCase().contains(win) - person Hassan; 12.09.2015
comment
где вы использовали метод convertStreamToString? - person Omore; 25.01.2018
comment
@Omore, ты спрашиваешь, где это определено? Я думаю, что это пользовательский метод, который я написал. У меня больше нет доступа к коду, поэтому вам придется выяснить, как его реализовать. Если вы это сделаете, обновите мой ответ, чтобы включить его; Вы получите очки за это. - person carlin.scott; 26.01.2018
comment
Существуют разные способы реализации convertStreamToString: stackoverflow.com/questions/309424/ - person torno; 06.03.2018

Вам понадобится библиотека jpcap (возможно, SourceForge jpcap тоже работает) и используйте класс ICMPPacket для реализации желаемой функциональности.

Вот реализация Java traceroute с использованием библиотека jpcap.

person bebbo    schedule 18.04.2016
comment
Удалось ли кому-нибудь реализовать это с помощью JNI-библиотек libpcap? Я проверил jpcap и pcap4j, и оба они не должны использоваться людьми :-( Вам нужно иметь докторскую степень, чтобы использовать их правильно. И они разработаны не для разработчиков Java, нет инструкций по использованию в средах Java. - person nickolay.laptev; 24.10.2019