From 0990f98b1430bdd79022d48981f91ddf354bae78 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Thu, 19 Feb 2015 09:34:32 +0100 Subject: [PATCH] InetAddress.isReachable is reported reliable on mac and recent java versions Refactored NetUtils.isReachable to two functions: isReachableByEcho and isPortOpen If the first one will fail, the second one will be used --- .../discoverers/NetworkDiscovery.java | 5 +--- .../src/processing/app/helpers/NetUtils.java | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java index 106b50924..6f593571a 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java @@ -75,10 +75,7 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino. ports.add(0, 22); } - boolean reachable = false; - for (Integer port : ports) { - reachable = reachable || NetUtils.isReachable(inetAddress, port); - } + boolean reachable = NetUtils.isReachable(inetAddress, ports); if (!reachable) { boardPortIterator.remove(); } diff --git a/arduino-core/src/processing/app/helpers/NetUtils.java b/arduino-core/src/processing/app/helpers/NetUtils.java index 96fe6ff09..67201bf3d 100644 --- a/arduino-core/src/processing/app/helpers/NetUtils.java +++ b/arduino-core/src/processing/app/helpers/NetUtils.java @@ -4,10 +4,37 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; +import java.util.Arrays; +import java.util.List; public abstract class NetUtils { + private static boolean isReachableByEcho(InetAddress address) { + try { + return address.isReachable(100); + } catch (IOException e) { + return false; + } + } + public static boolean isReachable(InetAddress address, int port) { + return isReachable(address, Arrays.asList(port)); + } + + public static boolean isReachable(InetAddress address, List ports) { + if (isReachableByEcho(address)) { + return true; + } + + boolean reachable = false; + for (Integer port : ports) { + reachable = reachable || isPortOpen(address, port); + } + + return reachable; + } + + private static boolean isPortOpen(InetAddress address, int port) { Socket socket = null; try { socket = new Socket();