view src/main/java/jp/ac/u_ryukyu/treevnc/TreeVNCNetwork.java @ 470:f7210f834403

add unique node id
author mir3636
date Wed, 03 Aug 2016 19:09:11 +0900
parents 5bef0f09f088
children 141f627665ab
line wrap: on
line source

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;
import java.util.Enumeration;
import java.util.HashMap;

import com.glavsoft.viewer.swing.ConnectionParams;

public class TreeVNCNetwork {

    private HashMap<String, TreeManagement> interfaces = new HashMap<String, TreeManagement>();
    private TreeRFBProto myRfb;
    private boolean useHostName = false;

    public TreeRFBProto getMyRfb() {
        return myRfb;
    }

    public void setMyRfb(TreeRFBProto myRfb) {
        this.myRfb = myRfb;
    }

    public void getNetworkInterfaces() throws SocketException {
		int treeId = 0;
    	for (Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); e.hasMoreElements();) {
    		NetworkInterface ni = e.nextElement();
    		if (ni.isUp() && ni.supportsMulticast() && !ni.isLoopback()) {
                TreeManagement treeManager = new TreeManagement(ni.getDisplayName(), ConnectionParams.DEFAULT_VNC_ROOT, myRfb.getViewer().getShowTree(),treeId++);
                addNetworkInterface(ni, treeManager);  // it looks like only last address is used
                for (InterfaceAddress ipaddress : ni.getInterfaceAddresses()) {
                    byte [] netmask = getNetMask(ipaddress);
                    String hostName = ipaddress.getAddress().toString();
                    if (useHostName) {
                        hostName = ipaddress.getAddress().getHostName();
                    }
                    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,ipaddress.getAddress());
                    System.out.println("Interfaces :" + ni.getName() + " treeId=" + treeId + " " + hostName);
    			}
    		}
        }
    }
    
    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+7 < prefix) {
    			    netmask[i] = (byte)0xff;
    			} else if (bitpos < 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;
    			} else {
    			    netmask[i] = 0;
    			}
    		}
		return netmask ;
	}

	NetworkInterface getInterface(Socket vncSocket) {
        InetAddress address = vncSocket.getInetAddress();
        try {
            return NetworkInterface.getByInetAddress(address);
        } catch (SocketException e) {
            return null;
        }
    }

    private void addNetworkInterface(NetworkInterface ni, TreeManagement treeManager) {
        setTreeManager(ni.getName(), treeManager);
    }

	public void setTreeManager(String intf, TreeManagement treeManager) {
        interfaces.put(intf, treeManager);
	}

	public TreeManagement getTreeManager(String intf) {
		return interfaces.get(intf);
	}

	
}