0

我正在尝试将 IP 地址从 192.168.1.1 ping 到 192.168.1.254。首先,我使用的是 InetAddress 类,但它被窃听了,一些 IP 即使它们是也无法访问。之后我尝试了这种方法,它对于单个 ping IP 非常有效,但是当我将它放在 for-loop 中时,所有 ping 的 IP 都可以到达......你们能告诉我这里有什么问题吗?

代码:

public class Main {
public static void main(String[] args) {
    String ip="192.168.1.";
    try
    {
        for(int i=0;i<=254;i++){
        String ip2=ip+i;
        boolean reachable = (java.lang.Runtime.getRuntime().exec("ping -n 1 "+ip2).waitFor()==0);
        if(reachable){
            System.out.println("IP is reachable:: "+ip2);
        }
        else{
            System.out.println("IP is not reachable: "+ip2);
        }
        }
    }catch(Exception e)
    {
        e.printStackTrace();
    }

}

}

编辑1:

我使用内置的 Java 函数来执行 ping,但它不工作(再次)

这是我使用的代码

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test {

public static void main(String[] args) throws UnknownHostException, IOException {
    String ip = "192.168.1.243";
    InetAddress inet = InetAddress.getByName(ip);
    System.out.println("Sending Ping Request to " + ip);
    if (inet.isReachable(5000)){
        System.out.println(ip+" is reachable");
    }
    else{
        System.out.println(ip+" is not reachable");
    }

}
}

输出是:

Sending Ping Request to 192.168.1.243
192.168.1.243 is not reachable

当我从 Windows 7 内置 Ping 功能 (cmd) 执行 ping 操作时,这也是 ping 结果

在此处输入图像描述

4

3 回答 3

3

改为使用isReachable()

InetAddress.getByName(address).isReachable(timeout);
于 2013-06-06T21:33:21.283 回答
1

为什么它不起作用:

您正在使用 ping 进程的退出状态,而不是 ping 本身的实际结果。它只会告诉你进程是否正常退出。ping 失败不会导致进程异常退出,因此始终返回退出代码 0(零)。

你可以尝试什么:

获取进程的输出流,它会告诉你输出是什么。然后尝试解释/解析这个,但是你想:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Process.html#getOutputStream%28%29

(虽然这对我来说也不完美,但它比使用退出代码更好的选择)

于 2013-06-06T21:30:00.133 回答
0

尊敬的先生,您的程序无法通过循环 ping 系统的问题是,与来自系统的回复相比,循环的执行速度更快。这就是为什么其中一些回复无法访问的原因,为了解决您应该使用的此类问题一个线程并通过使用 Thread.sleep() 方法在每个 ping 上引入一点延迟。我认为这会起作用 谢谢

于 2014-06-10T19:35:23.347 回答