[prev in list] [next in list] [prev in thread] [next in thread]
List: jakarta-commons-dev
Subject: [commons-jcs] 04/07: Fix UDP broadcasts
From: tv () apache ! org
Date: 2021-03-30 19:04:11
Message-ID: 20210330190408.3812C8E94E () gitbox ! apache ! org
[Download RAW message or body]
This is an automated email from the ASF dual-hosted git repository.
tv pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jcs.git
commit 0ff5e650201dd0edf8ad468bf7eb713e94c11d1a
Author: Thomas Vandahl <tv@apache.org>
AuthorDate: Tue Mar 30 20:30:50 2021 +0200
Fix UDP broadcasts
---
.../jcs3/utils/discovery/UDPDiscoverySender.java | 2 +
.../jcs3/utils/discovery/UDPDiscoveryService.java | 60 +++++++++++++++++-----
2 files changed, 49 insertions(+), 13 deletions(-)
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java \
b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java
index 76d8c83..2375be1 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java
@@ -214,6 +214,8 @@ public class UDPDiscoverySender implements AutoCloseable
log.debug( "sending requestBroadcast" );
final UDPDiscoveryMessage message = new UDPDiscoveryMessage();
+ message.setHost(multicastAddress.getHostAddress());
+ message.setPort(multicastPort);
message.setRequesterId( CacheInfo.listenerId );
message.setMessageType( BroadcastType.REQUEST );
send( message );
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java \
b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java
index 2a9fa56..0260b00 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java
@@ -20,12 +20,14 @@ package org.apache.commons.jcs3.utils.discovery;
*/
import java.io.IOException;
+import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
+import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.ArrayList;
+import java.util.Enumeration;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -122,21 +124,55 @@ public class UDPDiscoveryService
if (getUdpDiscoveryAttributes().getServiceAddress() == null ||
getUdpDiscoveryAttributes().getServiceAddress().isEmpty())
{
+ // Use same interface as for multicast
+ NetworkInterface serviceInterface = null;
+ if (getUdpDiscoveryAttributes().getUdpDiscoveryInterface() != null)
+ {
+ serviceInterface = NetworkInterface.getByName(
+ getUdpDiscoveryAttributes().getUdpDiscoveryInterface());
+ }
+ else
+ {
+ serviceInterface = HostNameUtil.getMulticastNetworkInterface();
+ }
+
try
{
- final List<InetAddress> addresses = \
HostNameUtil.getLocalHostLANAddresses();
- final InetAddress serviceAddress;
+ InetAddress serviceAddress = null;
- if (multicastAddress instanceof Inet6Address)
+ for (Enumeration<InetAddress> addresses = \
serviceInterface.getInetAddresses(); + \
addresses.hasMoreElements();) {
- // if Multicast uses IPv6, try to publish our IPv6 address
- serviceAddress = addresses.stream()
- .filter(address -> address instanceof Inet6Address)
- .findFirst().orElse(addresses.get(0));
+ serviceAddress = addresses.nextElement();
+
+ if (multicastAddress instanceof Inet6Address)
+ {
+ if (serviceAddress instanceof Inet6Address &&
+ !serviceAddress.isLoopbackAddress() &&
+ !serviceAddress.isMulticastAddress() &&
+ serviceAddress.isLinkLocalAddress())
+ {
+ // if Multicast uses IPv6, try to publish our IPv6 \
address + break;
+ }
+ }
+ else
+ {
+ if (serviceAddress instanceof Inet4Address &&
+ !serviceAddress.isLoopbackAddress() &&
+ !serviceAddress.isMulticastAddress() &&
+ serviceAddress.isSiteLocalAddress())
+ {
+ // if Multicast uses IPv4, try to publish our IPv4 \
address + break;
+ }
+ }
}
- else
+
+ if (serviceAddress == null)
{
- serviceAddress = addresses.get(0);
+ // Nothing found for given interface, fall back
+ serviceAddress = HostNameUtil.getLocalHostLANAddress();
}
\
getUdpDiscoveryAttributes().setServiceAddress(serviceAddress.getHostAddress()); @@ \
-214,7 +250,7 @@ public class UDPDiscoveryService
*/
public void initiateBroadcast()
{
- log.debug( "Creating sender thread for discoveryAddress = [{0}] and "
+ log.debug( "Creating sender for discoveryAddress = [{0}] and "
+ "discoveryPort = [{1}] myHostName = [{2}] and port = [{3}]",
() -> getUdpDiscoveryAttributes().getUdpDiscoveryAddr(),
() -> getUdpDiscoveryAttributes().getUdpDiscoveryPort(),
@@ -414,12 +450,10 @@ public class UDPDiscoveryService
cleanupTaskFuture.cancel(false);
}
- // no good way to do this right now.
if (receiver != null)
{
log.info( "Shutting down UDP discovery service receiver." );
receiver.shutdown();
- udpReceiverThread.interrupt();
}
log.info( "Shutting down UDP discovery service sender." );
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic