如何在Windows上使用Java同时发送多个ping而不使用ping.exe?

如何在Windows上使用Java同时发送多个ping而不使用ping.exe?,java,windows,ping,icmp,Java,Windows,Ping,Icmp,我的应用程序需要同时ping多个IP地址以提高代码的执行速度。例如,ping 300个ip地址在1秒后超时需要5分钟,而如果一次运行20个ip地址,则只需要大约15秒 我曾尝试为此调用windows ping.exe,但我遇到了两个不同且类似的问题。一个问题是,在一些windows机器上,ping会毫无理由地挂起几分钟,直到我杀死线程,它就死了。另一个问题是,以前的机器上ping.exe已经完全崩溃,任何ping.exe调用都会永远持续,因此数百个ping.exe进程开始堆积,直到机器崩溃,在这

我的应用程序需要同时ping多个IP地址以提高代码的执行速度。例如,ping 300个ip地址在1秒后超时需要5分钟,而如果一次运行20个ip地址,则只需要大约15秒

我曾尝试为此调用windows ping.exe,但我遇到了两个不同且类似的问题。一个问题是,在一些windows机器上,ping会毫无理由地挂起几分钟,直到我杀死线程,它就死了。另一个问题是,以前的机器上ping.exe已经完全崩溃,任何ping.exe调用都会永远持续,因此数百个ping.exe进程开始堆积,直到机器崩溃,在这种情况下,从命令行手动运行ping.exe只会让另一个ping进程永远挂起

我尝试使用一个名为的库,但该库只允许在Windows上一次进行一次ping

我尝试了这个,结果在我的本地网络上遇到了问题。当ping一个不存在的本地地址(在你的子网上)时,显然你会得到一个回复,说这个地址是不可访问的。在50%的回复中,我会得到一个超时,而在另外50%的回复中,我会得到“unpingable”


有人知道一种方法可以在不使用icmp4j或ping.exe的情况下在windows上同时运行多个ping吗

InetAddress.isReachable()
是您需要的基本工具


icmp4j应该可以很好地完成这项工作,因为这只是
isReachable
的包装。也许您不能使用静态入口点
icmpingutil.executePingRequest()
,尽管快速查看代码看起来并不十分令人担忧。如果您使用该方法遍历代码(
NativeBridge
JavaNativeBridge
IcmPingRequest
icmpingresponse
就足够了),那么您应该能够构建一个健壮的线程安全类,可以执行您需要的操作。

可能的副本请看一看:@JohnKane,它不起作用,因为我实际上需要执行ICMP ping,而不是套接字连接。@Tim发布的解决方案最终是“不要使用ICMP ping,使用套接字”,这对我不起作用,因为我需要使用ICMP ping。有一篇来自该线程的链接文章,这是我目前正在尝试的(我在文章的上面链接了它),但它似乎有自己的问题。在windows上,使用
-n
选项(带有一个小值,如
2
)来指定要发送的回显请求数(否则它将继续发送回显请求)。(注意:在其他一些操作系统上,“计数”的选项是
-c
InetAddress.isReachable()
与windows一起使用时实际上不会ping。它尝试与端口7建立TCP连接,以查看是否得到回复。
WindowsNativeBridge.java
文件中的一条注释使我认为从该文件复制将有相同的问题:警告:此方法是同步的,因为如果多个线程调用IcmpLibrary.IcmpSendEcho(),则结果将损坏!!!因此,现在我们别无选择,只能找到如何调用IcmpSendEcho2,或调用ping.exe。我担心的是,他们的评论确实给了我一些尝试的机会,但这并不一定意味着它会工作且复杂。你需要不损坏响应吗?如果您只需要ping-to-ping,而不需要访问ICMP响应中的值,那么它可能足以满足您的需要。(或者,升级到linux)我真的无法将100多台客户机器升级到linux:P而且,如果您想ping,InetAddress.isReachable非常糟糕。我只是在8.8.8.8(谷歌DNS)上使用了它,它告诉我它是不可访问的。在linux中也很糟糕,因为它需要根权限才能工作,这太疯狂了。可惜java套接字不允许您选择族。您可能需要自己使用,并使用java来调用本机函数。如果你让它工作起来,你可以为icmp4j做贡献!