diff --git a/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java b/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java index 2ece19d..78d5950 100644 --- a/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java +++ b/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.net.*; +import static fr.insa.clavardator.network.NetUtil.isLocalAddress; + public class NetDiscoverer { private static final short DISCOVERY_PORT = 31593; private static final short RESPONSE_PORT = 31594; @@ -51,10 +53,20 @@ public class NetDiscoverer { broadcastListener.stopListening(); broadcastListener = new BroadcastListener((ipAddr, data) -> { - if (onBroadcastReceived != null) - onBroadcastReceived.onBroadcastReceived(ipAddr, data); - responseSender = new ResponseSender(ipAddr, responseMessage, errorCallback); - responseSender.start(); + try { + if (!isLocalAddress(ipAddr)) { + if (onBroadcastReceived != null) + onBroadcastReceived.onBroadcastReceived(ipAddr, data); + responseSender = new ResponseSender(ipAddr, responseMessage, errorCallback); + responseSender.start(); + } else { + Log.w(this.getClass().getSimpleName(), "Received broadcast from self"); + } + } catch (SocketException e) { + Log.e(this.getClass().getSimpleName(), "Error getting local adresses", e); + if (errorCallback != null) + errorCallback.onError(e); + } }, e -> { if (errorCallback != null) errorCallback.onError(e); diff --git a/src/main/java/fr/insa/clavardator/network/NetUtil.java b/src/main/java/fr/insa/clavardator/network/NetUtil.java index 04b13cd..1ffaf86 100644 --- a/src/main/java/fr/insa/clavardator/network/NetUtil.java +++ b/src/main/java/fr/insa/clavardator/network/NetUtil.java @@ -1,15 +1,20 @@ package fr.insa.clavardator.network; +import fr.insa.clavardator.util.Log; + import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.SocketException; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import java.util.Objects; +import java.util.*; public class NetUtil { + /** + * Lists all ipv4 broadcast addresses + * + * @return + * @throws SocketException + */ public static List listAllBroadcastAddresses() throws SocketException { List broadcastList = new ArrayList<>(); final Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); @@ -26,6 +31,12 @@ public class NetUtil { return broadcastList; } + /** + * Lists all local Ipv4 addresses + * + * @return + * @throws SocketException + */ public static List listAllLocalAddresses() throws SocketException { List localList = new ArrayList<>(); final Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); @@ -34,14 +45,21 @@ public class NetUtil { NetworkInterface networkInterface = interfaces.nextElement(); if (!networkInterface.isLoopback() && networkInterface.isUp()) { networkInterface.getInterfaceAddresses().stream() + .filter((i) -> Objects.nonNull(i.getBroadcast())) .map(InterfaceAddress::getAddress) .filter(Objects::nonNull) .forEach(localList::add); } } + Log.v("NetUtil", "Local addresses: " + Arrays.toString(new List[]{localList})); return localList; } + public static boolean isLocalAddress(InetAddress address) throws SocketException { + final List list = listAllLocalAddresses(); + return list.stream().anyMatch((a) -> Arrays.equals(address.getAddress(), a.getAddress())); + } + public static int getIdFromIp(InetAddress ipAddr) { byte[] addr = ipAddr.getAddress(); int id = 0;