1
2
3
4 package javax.jmdns.impl;
5
6 import java.lang.reflect.Method;
7 import java.net.InetAddress;
8 import java.net.NetworkInterface;
9 import java.net.SocketException;
10 import java.util.Enumeration;
11 import java.util.HashSet;
12 import java.util.Set;
13 import java.util.logging.Level;
14 import java.util.logging.Logger;
15
16 import javax.jmdns.NetworkTopologyDiscovery;
17
18
19
20
21
22
23 public class NetworkTopologyDiscoveryImpl implements NetworkTopologyDiscovery {
24 private final static Logger logger = Logger.getLogger(NetworkTopologyDiscoveryImpl.class.getName());
25
26 private final Method _isUp;
27
28 private final Method _supportsMulticast;
29
30
31
32
33 public NetworkTopologyDiscoveryImpl() {
34 super();
35 Method isUp;
36 try {
37 isUp = NetworkInterface.class.getMethod("isUp", (Class<?>[]) null);
38 } catch (Exception exception) {
39
40 isUp = null;
41 }
42 _isUp = isUp;
43 Method supportsMulticast;
44 try {
45 supportsMulticast = NetworkInterface.class.getMethod("supportsMulticast", (Class<?>[]) null);
46 } catch (Exception exception) {
47
48 supportsMulticast = null;
49 }
50 _supportsMulticast = supportsMulticast;
51 }
52
53
54
55
56
57 @Override
58 public InetAddress[] getInetAddresses() {
59 Set<InetAddress> result = new HashSet<InetAddress>();
60 try {
61
62 for (Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces(); nifs.hasMoreElements();) {
63 NetworkInterface nif = nifs.nextElement();
64 for (Enumeration<InetAddress> iaenum = nif.getInetAddresses(); iaenum.hasMoreElements();) {
65 InetAddress interfaceAddress = iaenum.nextElement();
66 if (logger.isLoggable(Level.FINEST)) {
67 logger.finest("Found NetworkInterface/InetAddress: " + nif + " -- " + interfaceAddress);
68 }
69 if (this.useInetAddress(nif, interfaceAddress)) {
70 result.add(interfaceAddress);
71 }
72 }
73 }
74 } catch (SocketException se) {
75 logger.warning("Error while fetching network interfaces addresses: " + se);
76 }
77 return result.toArray(new InetAddress[result.size()]);
78 }
79
80
81
82
83
84 @Override
85 public boolean useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress) {
86 try {
87 if (_isUp != null) {
88 try {
89 if (!((Boolean) _isUp.invoke(networkInterface, (Object[]) null)).booleanValue()) {
90 return false;
91 }
92 } catch (Exception exception) {
93
94 }
95 }
96 if (_supportsMulticast != null) {
97 try {
98 if (!((Boolean) _supportsMulticast.invoke(networkInterface, (Object[]) null)).booleanValue()) {
99 return false;
100 }
101 } catch (Exception exception) {
102
103 }
104 }
105 if (interfaceAddress.isLoopbackAddress()) {
106 return false;
107 }
108 return true;
109 } catch (Exception exception) {
110 return false;
111 }
112 }
113
114
115
116
117
118 @Override
119 public void lockInetAddress(InetAddress interfaceAddress) {
120
121 }
122
123
124
125
126
127 @Override
128 public void unlockInetAddress(InetAddress interfaceAddress) {
129
130 }
131
132 }