【问题标题】:Ping function returns that all pinged IP addresses is reachablePing 函数返回所有 ping 的 IP 地址都可以访问
【发布时间】:2013-06-03 01:24:18
【问题描述】:

我正在尝试 ping 从 192.168.1.1 到 192.168.1.254 的 IP 地址。首先,我使用的是 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 结果

【问题讨论】:

  • 你正在检查waitFor()==0。这意味着您只有在它立即返回时才认为它是可访问的(对于立即返回的某些值)。如果它在 0.245 秒内返回怎么办?换句话说,您想检查 ping 返回的内容,而不是它是否返回。我应该注意到,使用 Java 调用 ping 是一个糟糕的主意
  • .waitFor 返回进程的退出状态,是不是ping命令本身ping成功与否总是返回0? docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
  • @Chris 调用 .waitFor 将导致当前线程在必要时阻塞,等待进程结束,如文档中所述“导致当前线程等待,如有必要,直到进程表示此 Process 对象已终止。”
  • 因为这是我的学校项目,我需要用 Java 编写代码。我知道在 Java 中 ping 是个坏主意,但我没有其他选择......
  • @SimonAndréForsberg 对。我想我误解了 waitFor 的输出。根据作者在 Windows 上使用 ping 的命令行参数,正如您所指出的,它始终返回 0。

标签: java for-loop ping runtime.exec


【解决方案1】:

请改用isReachable()

InetAddress.getByName(address).isReachable(timeout);

【讨论】:

  • isReachable() 有问题。即使某些 IP 可以访问,它也会返回 false...
  • @ZhiZha 我真的希望你为timeout 设置足够长的值。这对我来说似乎是最好的解决方案。我试过了,它似乎工作正常。我使用了 5000 的超时值。
  • @Simon André Forsberg InetAddress.getByName(address).isReachable(timeout);不能使用它,因为有时结果是错误的。
  • @ZhiZha 你用的是什么超时值?当您使用它时,请向我展示一个代码示例。还显示当您在没有 java 的情况下对同一 ip 执行 ping 命令时的输出。
  • @Simon André Forsberg 我在我的原始(第一个)帖子中添加了代码。当我使用 Windows Ping 函数执行 ping 操作时,您将在那里找到执行 ping 和结果的 Java 代码。
【解决方案2】:

为什么它不起作用:

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

您可以尝试什么:

获取进程的输出流,它会告诉你输出是什么。然后尝试按照您的意愿解释/解析它:

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

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

【讨论】:

  • 感谢您的帮助。将尝试使用流并检查字符串是否包含无法访问的内容,然后我将检查我的 IP 是否可访问...
  • @ZhiZha 不一定要说'unreachable',也可以说Request timed out. 还有,它会说的是程序运行的计算机的语言设置问题,这就是为什么这对我来说也不完美。
  • 你有什么建议?有什么好方法可以做一个简单的 ping 操作吗?
  • @ZhiZha 我强烈建议使用 BlueRaja 的答案,即:InetAddress.getByName(address).isReachable(5000); 超时 5 秒。根据docs.oracle.com/javase/6/docs/api/java/net/… 的文档,isReachable 使用 ICMP(与 ping 相同),也可以使用其他方式尝试到达目的地。
  • 问题是 InetAddress.getByName(address).isReachable(5000) 返回 false 即使某些 IP 可以访问 IP...
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多