当前位置: 首页 > 面试题库 >

如何从Windows进行真正的Java ping?

赖绪
2023-03-14
问题内容

我在网络上有一台试图通过Java程序ping的设备。通过Windows命令提示符,我可以ping设备地址,并对地址进行tracert。

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

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

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

为什么我可以通过cmd而不是程序来ping设备?我在各个地方都听说过,这不是真正的 ping。

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


问题答案:

isReachable()如果可以获取特权,将使用ICMP ECHO REQUESTs ,否则将尝试在目标主机的端口7(Echo)上建立TCP连接。 因此,你的问题可能是配置问题,没有足够的权限在客户端计算机上执行此操作,或者是如果客户端没有权限执行此操作,则在服务器上出现了端口7问题。在你的情况下,可能两者都有,你都需要解决另一方面,以使其正常工作。
ICMP ECHO REQUEST

我在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));
    }
}

根据我在这里阅读的内容。它显然是Windows的限制,并且ICMP PING Windows 2000之前的系统调用都不支持Windows,因此它默认情况下尝试连接到端口7,并且在你尝试“访问”的计算机上被阻止。Java还不支持新的本机系统调用。权限是针对基于Unix的系统,因为它们需要root才能发送ICMP数据包。

如果要为Windows 2000及更高版本推出自己的Windows本机JNI ICMP PING,则可以使用IcmpSendEcho Function。



 类似资料:
  • 问题内容: 我想在Windows中杀死特定的Java进程,例如在Linux中(获取processid然后杀死该进程)。 问题答案: 您可以使用JRE中包含的实用程序来查找Java进程的进程ID。输出将显示可执行JAR文件的名称或主类的名称。 然后使用Windows任务管理器终止该过程。如果要在命令行上执行此操作,请使用

  • 问题内容: 我有一个指向COM接口的指针,想从其虚拟表中获取函数指针并进行方法调用。为此,我需要进行stdcall方法调用。在Go中,如何在cgo中使用约定stdcall进行呼叫或使用约定stdcall进行呼叫? 问题答案: 有关如何在Windows上调用stdcall函数的说明,请参见“ godoc syscall Proc”。请注意,* Proc.Call确实会分配/取消分配内存,因此,如果您

  • 问题内容: 我玩了一段时间,发现了一些有趣的东西: 现在,错误显而易见了,将列表转换为元组就可以像开始时一样正常工作: 现在,我的问题是:为什么第 一个参数必须是str或str前缀的元组,而不是 str前缀 的列表 ? AFAIK,其Python代码可能如下所示: 但这让我更加困惑,因为即使记住了它,列表还是元组也应该没有任何区别。我想念什么? 问题答案: 从技术上讲,没有理由不接受其他序列类型。

  • 我想在内存使用效率方面比较Java程序的不同实现。有不同的使用场景被表述为JUnit测试用例。实际上,所有的代码都是开源的:https://github.com/headissue/cache2k-benchmark 获取Java程序已用内存的一般方法是:,当然也可以使用JMX接口来获取这些值。 但是,已使用内存的确定值不可靠。可能的原因: 可能有未收集的垃圾 有碎裂,如果GC没有压缩 到目前为止

  • 我在读OOOE(无序执行)以及如何解决虚假依赖关系(通过使用重命名)。 但我的问题是,我们如何解决真正的依赖关系(RAW-写后读)? 例如: 如果CPU选择在#1之前运行#2,则重命名在此处没有帮助。

  • 问题内容: 我有一个Windows应用程序,我想对其进行容器化。它是Windows桌面应用程序(不是Web应用程序)。我进行了一些搜索,发现关于容器化桌面应用程序的知识很少。我要容器化的应用程序在WindowsServerCore上运行良好。我的机器上有Windowsservercore映像。 我想知道如何进行容器化。有任何文档或有用的视频吗?当我完成dockerfile时,我可以与我的应用程序G