From a21f8c799bfbb6f7866affdeb5c4e01a6ab9161f Mon Sep 17 00:00:00 2001 From: "stefan.pingel@consensys.net" Date: Fri, 2 Feb 2024 11:43:46 +1000 Subject: [PATCH] close ServerSocket after testing availablity Signed-off-by: stefan.pingel@consensys.net --- .../org/hyperledger/besu/cli/BesuCommand.java | 5 +-- .../hyperledger/besu/util/NetworkUtility.java | 34 +++++++++---------- .../besu/util/NetworkUtilityTest.java | 12 +++++-- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 57d4cdb6a5..dec23b43ab 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -2555,11 +2555,12 @@ public class BesuCommand implements DefaultCommandValues, Runnable { .forEach( port -> { if (port.equals(p2PDiscoveryOptionGroup.p2pPort) - && !NetworkUtility.isPortAvailable(port)) { + && (NetworkUtility.isPortUnavailableForTcp(port) + || NetworkUtility.isPortUnavailableForUdp(port))) { unavailablePorts.add(port); } if (!port.equals(p2PDiscoveryOptionGroup.p2pPort) - && !NetworkUtility.isPortAvailableForTcp(port)) { + && NetworkUtility.isPortUnavailableForTcp(port)) { unavailablePorts.add(port); } }); diff --git a/util/src/main/java/org/hyperledger/besu/util/NetworkUtility.java b/util/src/main/java/org/hyperledger/besu/util/NetworkUtility.java index 352ee25eb4..1137a23ab0 100644 --- a/util/src/main/java/org/hyperledger/besu/util/NetworkUtility.java +++ b/util/src/main/java/org/hyperledger/besu/util/NetworkUtility.java @@ -160,41 +160,39 @@ public class NetworkUtility { } /** - * Is port available for tcp. + * Is this port unavailable for tcp. * * @param port the port - * @return the boolean + * @return true if the port is unavailable for tcp */ - public static boolean isPortAvailableForTcp(final int port) { + public static boolean isPortUnavailableForTcp(final int port) { try (final ServerSocket serverSocket = new ServerSocket()) { serverSocket.setReuseAddress(true); serverSocket.bind(new InetSocketAddress(port)); - return true; + serverSocket.close(); + return false; } catch (IOException ex) { LOG.trace(String.format("Failed to open port %d for TCP", port), ex); } - return false; + return true; } - private static boolean isPortAvailableForUdp(final int port) { + /** + * Is this port unavailable for udp. + * + * @param port the port + * @return true if the port is unavailable for udp + */ + public static boolean isPortUnavailableForUdp(final int port) { try (final DatagramSocket datagramSocket = new DatagramSocket(null)) { datagramSocket.setReuseAddress(true); datagramSocket.bind(new InetSocketAddress(port)); - return true; + datagramSocket.close(); + return false; } catch (IOException ex) { LOG.trace(String.format("failed to open port %d for UDP", port), ex); } - return false; - } - - /** - * Is port available. - * - * @param port the port - * @return the boolean - */ - public static boolean isPortAvailable(final int port) { - return isPortAvailableForTcp(port) && isPortAvailableForUdp(port); + return true; } /** diff --git a/util/src/test/java/org/hyperledger/besu/util/NetworkUtilityTest.java b/util/src/test/java/org/hyperledger/besu/util/NetworkUtilityTest.java index 0f60eb6769..a635d9f32e 100644 --- a/util/src/test/java/org/hyperledger/besu/util/NetworkUtilityTest.java +++ b/util/src/test/java/org/hyperledger/besu/util/NetworkUtilityTest.java @@ -17,6 +17,7 @@ package org.hyperledger.besu.util; import static org.assertj.core.api.Assertions.assertThat; import java.io.IOException; +import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.ServerSocket; @@ -35,12 +36,19 @@ public class NetworkUtilityTest { } @Test - public void assertPortIsNotAvailable() throws IOException { + public void assertTcpPortIsNotAvailable() throws IOException { final ServerSocket serverSocket = new ServerSocket(8541); - assertThat(!NetworkUtility.isPortAvailable(8541)).isEqualTo(true); + assertThat(NetworkUtility.isPortUnavailableForTcp(8541)).isEqualTo(true); serverSocket.close(); } + @Test + public void assertUdpPortIsNotAvailable() throws IOException { + final DatagramSocket datagramSocket = new DatagramSocket(8541); + assertThat(NetworkUtility.isPortUnavailableForUdp(8541)).isEqualTo(true); + datagramSocket.close(); + } + @Test public void assertLocalhostIdentification() { assertThat(NetworkUtility.isLocalhostAddress("127.0.0.1")).isTrue();