Mercurial > hg > Members > riono > TreeVNC_ja_comment
view src/main/java/jp/ac/u_ryukyu/treevnc/TreeVNCNetwork.java @ 463:5bef0f09f088
create NetworkAddress class
author | mir3636 |
---|---|
date | Wed, 06 Jul 2016 18:12:33 +0900 |
parents | b5459c7c8e4d |
children | f7210f834403 |
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); } }