gpt4 book ai didi

java - 如何从 Windows 执行真正的 Java ping?

转载 作者:IT老高 更新时间:2023-10-28 21:12:24 26 4
gpt4 key购买 nike

我正在尝试通过我的 Java 程序 ping 网络上的设备。通过我的 windows 命令提示符,我可以很好地 ping 设备地址并对地址进行跟踪。

在网上,我看到要通过 Java 执行 ping 操作,您必须执行以下操作:

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

但是,当我在我的设备地址上使用此代码时,它总是在我的程序中返回 false。我正在使用具有良好超时值的正确 IPv4 地址。另外,如果我使用 localhost 地址,它也可以正常工作。

为什么我可以通过 cmd ping 设备,但不能通过我的程序?我在很多地方都听说这不是一个真实的 ping。

有没有更好的方法在 Java 中模拟 ping?

谢谢

最佳答案

isReachable() 会使用ICMP ECHO REQUESTs 如果可以获取权限,否则会尝试建立TCP连接目的主机的端口 7(Echo)。
因此,如果您的客户端没有执行 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));
}
}

从我读到的 here .这显然是 Windows 的限制,并且在 Windows 上不支持 ICMP PING 作为 Windows 2000 之前的系统调用,因此它默认尝试连接到端口 7,并且在您所在的机器上被阻止试图“达到”。 Java 还不支持新的 native 系统调用。权限是基于 Unix 的系统,因为它们需要 root 发送 ICMP 数据包。

如果您想推出自己的 Windows 原生 JNI ICMP PING 用于 Windows 2000 和更新版本有 IcmpSendEcho Function .

关于java - 如何从 Windows 执行真正的 Java ping?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com