Zeroconf services may have multiple IP addresses: let's consider them all

This commit is contained in:
Federico Fissore 2013-07-22 10:06:21 +02:00
parent e6b11c44f6
commit 652168cb03
2 changed files with 32 additions and 27 deletions

View File

@ -33,7 +33,8 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.
Iterator<BoardPort> iterator = ports.iterator(); Iterator<BoardPort> iterator = ports.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
try { try {
if (!NetUtils.isReachable(InetAddress.getByName(iterator.next().getAddress()))) { BoardPort board = iterator.next();
if (!NetUtils.isReachable(InetAddress.getByName(board.getAddress()), Integer.parseInt(board.getPrefs().get("port")))) {
iterator.remove(); iterator.remove();
} }
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
@ -93,7 +94,8 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.
@Override @Override
public void serviceResolved(ServiceEvent serviceEvent) { public void serviceResolved(ServiceEvent serviceEvent) {
ServiceInfo info = serviceEvent.getInfo(); ServiceInfo info = serviceEvent.getInfo();
String address = info.getInet4Addresses()[0].getHostAddress(); for (InetAddress inetAddress : info.getInet4Addresses()) {
String address = inetAddress.getHostAddress();
String name = serviceEvent.getName(); String name = serviceEvent.getName();
PreferencesMap prefs = null; PreferencesMap prefs = null;
@ -105,6 +107,8 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.
prefs.put("distro_version", info.getPropertyString("distro_version")); prefs.put("distro_version", info.getPropertyString("distro_version"));
} }
prefs.put("port", "" + info.getPort());
String label = name + " at " + address; String label = name + " at " + address;
if (board != null) { if (board != null) {
String boardName = Base.getPlatform().resolveDeviceByBoardID(Base.packages, board); String boardName = Base.getPlatform().resolveDeviceByBoardID(Base.packages, board);
@ -123,6 +127,7 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.
ports.add(port); ports.add(port);
} }
} }
}
private void removeDuplicateBoards(BoardPort newBoard) { private void removeDuplicateBoards(BoardPort newBoard) {
Iterator<BoardPort> iterator = ports.iterator(); Iterator<BoardPort> iterator = ports.iterator();

View File

@ -7,11 +7,11 @@ import java.net.Socket;
public abstract class NetUtils { public abstract class NetUtils {
public static boolean isReachable(InetAddress address) { public static boolean isReachable(InetAddress address, int port) {
Socket socket = null; Socket socket = null;
try { try {
socket = new Socket(); socket = new Socket();
socket.connect(new InetSocketAddress(address, 80), 100); socket.connect(new InetSocketAddress(address, port), 100);
return true; return true;
} catch (IOException e) { } catch (IOException e) {
return false; return false;