Fix mDNS detection of hosts with the same IP address

This is the case for PCs running GFE and Sunshine side-by-side.
This commit is contained in:
Cameron Gutman
2023-02-25 20:29:17 -06:00
parent 94b202f7b6
commit f659af29da
4 changed files with 7 additions and 44 deletions
@@ -431,11 +431,6 @@ public class ComputerManagerService extends Service {
} }
} }
@Override
public void notifyComputerRemoved(MdnsComputer computer) {
// Nothing to do here
}
@Override @Override
public void notifyDiscoveryFailure(Exception e) { public void notifyDiscoveryFailure(Exception e) {
LimeLog.severe("mDNS discovery failed"); LimeLog.severe("mDNS discovery failed");
@@ -54,13 +54,6 @@ public class DiscoveryService extends Service {
} }
} }
@Override
public void notifyComputerRemoved(MdnsComputer computer) {
if (boundListener != null) {
boundListener.notifyComputerRemoved(computer);
}
}
@Override @Override
public void notifyDiscoveryFailure(Exception e) { public void notifyDiscoveryFailure(Exception e) {
if (boundListener != null) { if (boundListener != null) {
@@ -7,7 +7,6 @@ import java.net.Inet6Address;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -25,13 +24,13 @@ public class MdnsDiscoveryAgent implements ServiceListener {
private MdnsDiscoveryListener listener; private MdnsDiscoveryListener listener;
private Thread discoveryThread; private Thread discoveryThread;
private HashMap<InetAddress, MdnsComputer> computers = new HashMap<InetAddress, MdnsComputer>(); private HashSet<MdnsComputer> computers = new HashSet<>();
private HashSet<String> pendingResolution = new HashSet<String>(); private HashSet<String> pendingResolution = new HashSet<>();
// The resolver factory's instance member has a static lifetime which // The resolver factory's instance member has a static lifetime which
// means our ref count and listener must be static also. // means our ref count and listener must be static also.
private static int resolverRefCount = 0; private static int resolverRefCount = 0;
private static HashSet<ServiceListener> listeners = new HashSet<ServiceListener>(); private static HashSet<ServiceListener> listeners = new HashSet<>();
private static ServiceListener nvstreamListener = new ServiceListener() { private static ServiceListener nvstreamListener = new ServiceListener() {
@Override @Override
public void serviceAdded(ServiceEvent event) { public void serviceAdded(ServiceEvent event) {
@@ -107,7 +106,7 @@ public class MdnsDiscoveryAgent implements ServiceListener {
return false; return false;
} }
} }
}; }
static { static {
// Override jmDNS's default topology discovery class with ours // Override jmDNS's default topology discovery class with ours
@@ -261,7 +260,7 @@ public class MdnsDiscoveryAgent implements ServiceListener {
for (Inet4Address v4Addr : v4Addrs) { for (Inet4Address v4Addr : v4Addrs) {
synchronized (computers) { synchronized (computers) {
MdnsComputer computer = new MdnsComputer(info.getName(), v4Addr, v6GlobalAddr, info.getPort()); MdnsComputer computer = new MdnsComputer(info.getName(), v4Addr, v6GlobalAddr, info.getPort());
if (computers.put(computer.getLocalAddress(), computer) == null) { if (computers.add(computer)) {
// This was a new entry // This was a new entry
listener.notifyComputerAdded(computer); listener.notifyComputerAdded(computer);
} }
@@ -274,8 +273,7 @@ public class MdnsDiscoveryAgent implements ServiceListener {
if (v6LocalAddr != null || v6GlobalAddr != null) { if (v6LocalAddr != null || v6GlobalAddr != null) {
MdnsComputer computer = new MdnsComputer(info.getName(), v6LocalAddr, v6GlobalAddr, info.getPort()); MdnsComputer computer = new MdnsComputer(info.getName(), v6LocalAddr, v6GlobalAddr, info.getPort());
if (computers.put(v6LocalAddr != null ? if (computers.add(computer)) {
computer.getLocalAddress() : computer.getIpv6Address(), computer) == null) {
// This was a new entry // This was a new entry
listener.notifyComputerAdded(computer); listener.notifyComputerAdded(computer);
} }
@@ -353,7 +351,7 @@ public class MdnsDiscoveryAgent implements ServiceListener {
public List<MdnsComputer> getComputerSet() { public List<MdnsComputer> getComputerSet() {
synchronized (computers) { synchronized (computers) {
return new ArrayList<MdnsComputer>(computers.values()); return new ArrayList<>(computers);
} }
} }
@@ -377,28 +375,6 @@ public class MdnsDiscoveryAgent implements ServiceListener {
@Override @Override
public void serviceRemoved(ServiceEvent event) { public void serviceRemoved(ServiceEvent event) {
LimeLog.info("mDNS: Machine disappeared: "+event.getInfo().getName()); LimeLog.info("mDNS: Machine disappeared: "+event.getInfo().getName());
Inet4Address v4Addrs[] = event.getInfo().getInet4Addresses();
for (Inet4Address addr : v4Addrs) {
synchronized (computers) {
MdnsComputer computer = computers.remove(addr);
if (computer != null) {
listener.notifyComputerRemoved(computer);
break;
}
}
}
Inet6Address v6Addrs[] = event.getInfo().getInet6Addresses();
for (Inet6Address addr : v6Addrs) {
synchronized (computers) {
MdnsComputer computer = computers.remove(addr);
if (computer != null) {
listener.notifyComputerRemoved(computer);
break;
}
}
}
} }
@Override @Override
@@ -2,6 +2,5 @@ package com.limelight.nvstream.mdns;
public interface MdnsDiscoveryListener { public interface MdnsDiscoveryListener {
void notifyComputerAdded(MdnsComputer computer); void notifyComputerAdded(MdnsComputer computer);
void notifyComputerRemoved(MdnsComputer computer);
void notifyDiscoveryFailure(Exception e); void notifyDiscoveryFailure(Exception e);
} }