diff src/main/java/jp/ac/u_ryukyu/treevnc/TreeVNCNetwork.java @ 208:f1d7cb4a1868

compute netmask and netaddress
author oc
date Wed, 02 Jul 2014 18:52:29 +0900
parents b31903e5b02d
children 2132018b8c68
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeVNCNetwork.java	Wed Jul 02 18:14:20 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeVNCNetwork.java	Wed Jul 02 18:52:29 2014 +0900
@@ -1,6 +1,7 @@
 package jp.ac.u_ryukyu.treevnc;
 
 import java.net.InetAddress;
+import java.net.InterfaceAddress;
 import java.net.NetworkInterface;
 import java.net.Socket;
 import java.net.SocketException;
@@ -23,20 +24,49 @@
     }
 
     public void getNetworkInterfaces() throws SocketException {
-        for (Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); e.hasMoreElements();) {
-            NetworkInterface ni;
-            ni = e.nextElement();
-            if (ni.isUp() && ni.supportsMulticast() && !ni.isLoopback()) {
-                String hostName = ni.getInetAddresses().nextElement().getHostAddress();
-                TreeManagement treeManager = new TreeManagement(hostName, ConnectionParams.DEFAULT_VNC_ROOT, myRfb.getViewer().getShowTree());
-                treeManager.getList().getFirst().setPort(myRfb.getAcceptPort());
-                addNetworkInterface(ni, treeManager);               
-                System.out.println("Interfaces :" + ni.getName());
-            }
+    	for (Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); e.hasMoreElements();) {
+    		NetworkInterface ni = e.nextElement();
+    		if (ni.isUp() && ni.supportsMulticast() && !ni.isLoopback()) {
+    			for (InterfaceAddress ipaddress : ni.getInterfaceAddresses()) {
+    				byte [] netmask = getNetMask(ipaddress);
+    				String hostName = ipaddress.getAddress().getHostName();
+    				TreeManagement treeManager = new TreeManagement(hostName, ConnectionParams.DEFAULT_VNC_ROOT, myRfb.getViewer().getShowTree());
+    				treeManager.getList().getFirst().setPort(myRfb.getAcceptPort());
+    				byte[] netaddr = ipaddress.getAddress().getAddress();
+    				for(int i=0;i<netaddr.length;i++) {
+    					netaddr[i] &= netmask[i];
+    				}
+    				treeManager.setNetMask(netmask,netaddr);
+    				addNetworkInterface(ni, treeManager);               
+    				System.out.println("Interfaces :" + ni.getName());
+    			}
+    		}
         }
     }
     
-    NetworkInterface getInterface(Socket vncSocket) {
+    private byte[] getNetMask(InterfaceAddress ipaddress) {
+    		short prefix = ipaddress.getNetworkPrefixLength();
+    		byte[] netmask = ipaddress.getAddress().getAddress();
+    		for(int i = 0; i < netmask.length; i++) {
+    			int bitpos = i * 8;
+    			if (bitpos > prefix) {
+    				netmask[i] = 0;
+    			} else if (bitpos+8 > prefix) {
+    				//    ex. bitpos = 0, prefix = 2 
+    				//    bitpos+8-prefix
+    				//    1100 0000
+    				int bytemask = 0x80;
+    				for(int j = 1; j < bitpos+8-prefix; j++) {
+    					bytemask >>= 1;
+    					bytemask |= 0x80;
+    				}
+    				netmask[i] = (byte)bytemask;
+    			}
+    		}
+		return netmask ;
+	}
+
+	NetworkInterface getInterface(Socket vncSocket) {
         InetAddress address = vncSocket.getInetAddress();
         try {
             return NetworkInterface.getByInetAddress(address);
@@ -57,4 +87,6 @@
 		return interfaces.get(intf);
 	}
 
+	
+	
 }