gpt4 book ai didi

java - InetAddress isReachable 方法是否有最短超时时间?

转载 作者:行者123 更新时间:2023-11-29 08:33:17 26 4
gpt4 key购买 nike

InetAddress 类的 isReachable 方法出现奇怪的行为。

Method prototype是:

public boolean isReachable(int timeout)
  • 当使用超时> 1500(毫秒)时,该方法会等待准确的时间作为参数给出(当然如果目标 IP 不可访问...)。
  • 当使用超时 < 1500 时,该方法最多等待 1000 毫秒...

代码很简单:

    InetAddress addr = null;
String ip = "10.48.2.169";

try {
addr = InetAddress.getByName(ip);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Timestamp s = new Timestamp(System.currentTimeMillis());
System.out.println(s + "\t Starting tests :");

pingTest(addr, 100);
pingTest(addr, 500);
pingTest(addr, 1000);
pingTest(addr, 1500);
pingTest(addr, 2000);
pingTest(addr, 2500);

其中 pingTest 定义为:

public static void pingTest(InetAddress addr, int timeout) {
boolean result = false;
try {
result = addr.isReachable(timeout);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Timestamp s = new Timestamp(System.currentTimeMillis());
System.out.println(s + "\t (" + timeout + ") " + addr.toString() + " " + result);
}

那么输出是:

2017-09-07 16:45:41.573  Starting tests :
2017-09-07 16:45:42.542 (100) /10.48.2.169 false
2017-09-07 16:45:43.542 (500) /10.48.2.169 false
2017-09-07 16:45:44.541 (1000) /10.48.2.169 false
2017-09-07 16:45:46.041 (1500) /10.48.2.169 false
2017-09-07 16:45:48.041 (2000) /10.48.2.169 false
2017-09-07 16:45:50.541 (2500) /10.48.2.169 false

所以问题是:InetAddress isReachable 方法是否有最小超时时间?(我怀疑是 1500,但我怀疑,超时时间很长...)

或者也许我只是犯了一个我仍然想念的大错误......

如果这还不够清楚,请告诉我。

感谢您的帮助和想法。

最佳答案

首先您应该注意到 INetAddress.isReachable 的行为在 Java 支持的每个平台上是不一样的。我假设您在 Windows 上工作。

当未记录的行为发生时,您应该始终查看源代码(如果它们可用)。 Windows 的 java.net 实现是 here对于 OpenJDK(对于 Oracle JVM 应该非常相似,但我不确定这一点)。

我们在isReachable 方法实现中看到的是:

  1. 他们不依赖 ping,因为他们发现 Windows ICMP 协议(protocol)实现太不可靠
  2. 他们将超时值传递给 NET_Wait 函数

因此,isReachable 方法不执行 ping,我们需要检查 NET_Wait 对超时做了什么,以了解为什么小于 1 秒的超时不是'不可能。

NET_Wait 函数定义在这里:src/windows/native/java/net/net_util_md.c

它包含一个无限循环,当在 select 函数调用期间发生这些事件时该循环会中断:

  • NET_WAIT_CONNECT 套接字文件描述符(套接字已连接到远程主机)
  • 超时结束

select 函数记录在手册页中,您可以引用 here .这个手册页告诉我们超时可以“向上舍入到系统时钟粒度,内核调度延迟意味着阻塞间隔可能会稍微超出”。

这就是不能保证最小超时值的原因。另外,我认为文档没有说明任何最小超时值,因为 JVM 支持的操作系统的实现不同。

希望这有助于您理解原因。

但是,要实现所需的超时,您可以在单独的任务中测试可达性。您等待任务返回结果,或者如果您等待的时间超过超时时间,则取消任务或忽略其结果。

关于java - InetAddress isReachable 方法是否有最短超时时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46099526/

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