1

LANネットワーク上のすべてのコンピューターにpingを実行するプロジェクトがあります。最初に使用InetAddress.isReachable()しましたが、IP が到達可能であっても、IP が到達可能でないことを関数が返す場合があります (Windows の組み込み関数で試行し、IP は到達可能でした)。次に、このコードで試しました:

Process proc = new ProcessBuilder("ping", host).start();
int exitValue = proc.waitFor();
System.out.println("Exit Value:" + exitValue);

しかし、出力は間違っています。次に、少しグーグルして、このコードを見つけました:

import java.io.*;
import java.util.*;


public class JavaPingExampleProgram
{

  public static void main(String args[]) 
  throws IOException
  {
    // create the ping command as a list of strings
    JavaPingExampleProgram ping = new JavaPingExampleProgram();
    List<String> commands = new ArrayList<String>();
    commands.add("ping");
    commands.add("-n");
    commands.add("1");
    commands.add("192.168.1.1");
    ping.doCommand(commands);
  }
  public void doCommand(List<String> command) 
  throws IOException
  {
String s = null;

ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();

BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));

// read the output from the command
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null)
{
  System.out.println(s);
}

// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null)
{
  System.out.println(s);
    }
  }

}

このコードは問題なく動作しましたが、問題は、Windows が他の言語を使用している場合、アドレスに到達できるかどうかわからないことです。LANまたはVPNネットワークでIPアドレスにpingを実行する安全な方法を教えてください. ありがとうございました。

4

1 に答える 1

1

isReachable() は、特権を取得できる場合は ICMP ECHO REQUEST を使用します。それ以外の場合は、宛先ホストのポート 7 (Echo) で TCP 接続を確立しようとします。したがって、問題はおそらく、クライアントマシンでこれを行うのに十分な権限がないという構成の問題か、クライアントに ICMP ECHO REQUEST を実行する権限がない場合はサーバーのポート 7 の問題です。おそらく両方の場合、これを機能させるには、どちらか一方を解決する必要があります。

OSX および Linux クライアントで以下をテストしましたが、他の OSX、Linux、および Windows Server マシンの到達可能性をテストするときに機能します。これをクライアントとして実行するための Windows マシンがありません。

import java.io.IOException;
import java.net.InetAddress;

public class IsReachable
{
    public static void main(final String[] args) throws IOException
    {
        final InetAddress host = InetAddress.getByName(args[0]);
        System.out.println("host.isReachable(1000) = " + host.isReachable(1000));
    }
}
于 2013-06-07T10:43:42.713 に答える