如何在Java中使用ICMP和跟踪路由

如何在Java中使用ICMP和跟踪路由,java,sockets,traceroute,icmp,Java,Sockets,Traceroute,Icmp,Java没有用于ICMP和跟踪路由的原语。如何克服这个问题?基本上,我正在构建应该在*nix和Windows中运行的代码,并且需要一段可以在这两种平台上运行的代码。以下是我今天编写的用Java“实现”跟踪路由命令的内容。我只在windows中进行了测试,但它也应该在Linux中工作,尽管Linux上有几种跟踪路由工具,所以很可能需要对这些程序的存在进行一些检查 public class NetworkDiagnostics{ private final String os = System.

Java没有用于ICMP和跟踪路由的原语。如何克服这个问题?基本上,我正在构建应该在*nix和Windows中运行的代码,并且需要一段可以在这两种平台上运行的代码。

以下是我今天编写的用Java“实现”跟踪路由命令的内容。我只在windows中进行了测试,但它也应该在Linux中工作,尽管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;
}
您将需要(可能也在工作)并使用ICMPacket类来实现所需的功能


下面是使用的示例。

在使用convertStreamToString方法时,应将条件更改为os.toLowerCase().contains(“win”)。@Omore您想知道它是在哪里定义的吗?我想这是我写的自定义方法。我再也没有访问代码的权限了,所以您必须找出如何实现它。如果有,请更新我的答案,包括它;这样做你会得到分数。实现convertStreamToString有不同的方法:有人使用libpcap JNI库实现了它吗?我检查了jpcap和pcap4j,它们都不应该被人类使用:-(你需要有博士学位才能正确使用它们。它们不是为Java开发人员开发的,没有在Java环境中使用的说明。