diff --git a/src/net/azib/ipscan/core/net/ICMPPinger.java b/src/net/azib/ipscan/core/net/ICMPPinger.java index 7561129c..1fd21196 100644 --- a/src/net/azib/ipscan/core/net/ICMPPinger.java +++ b/src/net/azib/ipscan/core/net/ICMPPinger.java @@ -84,9 +84,8 @@ public class ICMPPinger implements Pinger { long start = OctetConverter.octetsToLong(data, dataOffset); long time = end - start; - result.totalTime += time; - result.replyCount++; - result.ttl = packet.getTTL() & 0xFF; + result.addReply(time); + result.setTTL(packet.getTTL() & 0xFF); } } catch (InterruptedIOException e) { diff --git a/src/net/azib/ipscan/core/net/ICMPSharedPinger.java b/src/net/azib/ipscan/core/net/ICMPSharedPinger.java index 783b43a2..1cd3ac58 100755 --- a/src/net/azib/ipscan/core/net/ICMPSharedPinger.java +++ b/src/net/azib/ipscan/core/net/ICMPSharedPinger.java @@ -116,7 +116,7 @@ public class ICMPSharedPinger implements Pinger { } int totalTimeout = timeout * count; - while (totalTimeout > 0 && result.replyCount < count) { + while (totalTimeout > 0 && result.getReplyCount() < count) { if (LOG.isLoggable(Level.FINEST)) { LOG.finest("Waiting for response " + address + ": " + totalTimeout); } @@ -198,10 +198,9 @@ public class ICMPSharedPinger implements Pinger { LOG.finest("Received " + packet.getSequenceNumber() + packet.getSourceAsInetAddress() + ": " + time); } - result.totalTime += time; - result.replyCount++; + result.addReply(time); // TTL should be the same among all packets - result.ttl = packet.getTTL() & 0xFF; + result.setTTL(packet.getTTL() & 0xFF); synchronized (result) { // notify the sender that we have an answer :-) diff --git a/src/net/azib/ipscan/core/net/PingResult.java b/src/net/azib/ipscan/core/net/PingResult.java index 753de288..a576cc09 100755 --- a/src/net/azib/ipscan/core/net/PingResult.java +++ b/src/net/azib/ipscan/core/net/PingResult.java @@ -14,23 +14,42 @@ public class PingResult { InetAddress address; - int ttl; - long totalTime; - int replyCount; + private int ttl; + private long totalTime; + private long longestTime; + private int replyCount; public PingResult(InetAddress address) { - this.address = address; - + this.address = address; + } + + public void addReply(long time) { + replyCount++; + if (time > longestTime) + longestTime = time; + totalTime += time; } public int getTTL() { return ttl; } + public void setTTL(int ttl) { + this.ttl = ttl; + } + public int getAverageTime() { return (int)(totalTime / replyCount); } + public int getLongestTime() { + return (int)longestTime; + } + + public int getReplyCount() { + return replyCount; + } + /** * @return true in case at least one reply was received */ diff --git a/src/net/azib/ipscan/core/net/TCPPinger.java b/src/net/azib/ipscan/core/net/TCPPinger.java index 84ef1c6b..f360797f 100755 --- a/src/net/azib/ipscan/core/net/TCPPinger.java +++ b/src/net/azib/ipscan/core/net/TCPPinger.java @@ -40,12 +40,10 @@ public class TCPPinger implements Pinger { long startTime = System.currentTimeMillis(); try { socket.connect(new InetSocketAddress(address, PROBE_TCP_PORT), timeout); - result.replyCount++; - result.totalTime+=System.currentTimeMillis()-startTime; + result.addReply(System.currentTimeMillis()-startTime); } catch (ConnectException e) { - result.replyCount++; - result.totalTime+=System.currentTimeMillis()-startTime; + result.addReply(System.currentTimeMillis()-startTime); } catch (SocketTimeoutException e) { } diff --git a/src/net/azib/ipscan/core/net/UDPPinger.java b/src/net/azib/ipscan/core/net/UDPPinger.java index 5e4be830..09dc52c3 100755 --- a/src/net/azib/ipscan/core/net/UDPPinger.java +++ b/src/net/azib/ipscan/core/net/UDPPinger.java @@ -44,8 +44,7 @@ public class UDPPinger implements Pinger { socket.receive(packet); } catch (PortUnreachableException e) { - result.replyCount++; - result.totalTime+=System.currentTimeMillis()-startTime; + result.addReply(System.currentTimeMillis()-startTime); } catch (SocketTimeoutException e) { } diff --git a/src/net/azib/ipscan/fetchers/PortsFetcher.java b/src/net/azib/ipscan/fetchers/PortsFetcher.java index 72102c06..1f323ba4 100755 --- a/src/net/azib/ipscan/fetchers/PortsFetcher.java +++ b/src/net/azib/ipscan/fetchers/PortsFetcher.java @@ -36,7 +36,6 @@ public class PortsFetcher implements Fetcher { public PortsFetcher(GlobalConfig globalConfig) { this.config = globalConfig; - this.portIteratorPrototype = new PortIterator(config.portString); } public String getLabel() { @@ -62,9 +61,9 @@ public class PortsFetcher implements Fetcher { // now try to adapt timeout if it is enabled and pinging results are availbale PingResult pingResult = (PingResult) subject.getParameter(PingFetcher.PARAMETER_PINGER); - if (config.adaptPortTimeout && pingResult.isAlive()) { + if (config.adaptPortTimeout && pingResult.getReplyCount() > 2) { // TODO: use longest time istead of the average one for adapting - adaptedTimeout = Math.min(Math.max(pingResult.getAverageTime() * 4, 30), config.portTimeout); + adaptedTimeout = Math.min(Math.max(pingResult.getLongestTime() * 4, 50), config.portTimeout); } Socket socket = null; @@ -129,6 +128,8 @@ public class PortsFetcher implements Fetcher { } public void init() { + // rebuild port iterator before each scan + this.portIteratorPrototype = new PortIterator(config.portString); } public void cleanup() {