⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhcpoption.java

📁 DHCP 的JAVA实现
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	    } catch (IOException e) {
			logger.log(Level.SEVERE, "Unexpected IOException", e);
	        return buf.toByteArray();
	    }
    }
    /**
     * Converts DHO_DHCP_AGENT_OPTIONS (82) option type to a LinkedMap.
     * 
     * <p>Order of parameters is preserved (use avc <tt>LinkedHashmap</tt<).
     * Keys are of type <tt>Byte</tt>, values are of type <tt>String</tt>.
     * 
     * @param buf byte[] buffer returned by </tt>getOptionRaw</tt>
     * @return the LinkedHashmap of values, <tt>null</tt> if buf is <tt>null</tt>
     */
    public static final Map<Byte, String> agentOptionsToMap(byte[] buf) {
    	if (buf == null) {
            return null;
        }

        Map<Byte, String> map = new LinkedHashMap<Byte, String>();
        int               i   = 0;

        while (i < buf.length) {
            if (buf.length - i < 2) {
                break;    // not enough data left
            }
            Byte key     = buf[i++];
            int  size    = unsignedByte(buf[i++]);
            int  instock = buf.length - i;

            if (size > instock) {
                size = instock;
            }
            map.put(key, DHCPPacket.bytesToString(buf, i, size));
            i += size;
        }
        return map;
    }
    
    /**
     * Returns the type of the option based on the option code.
     * 
     * <p>The type is returned as a <tt>Class</tt> object:
     * <ul>
     * 	<li><tt>InetAddress.class</tt></li>
     * 	<li><tt>InetAddress[].class</tt></li>
     * 	<li><tt>int.class</tt></li>
     * 	<li><tt>short.class</tt></li>
     * 	<li><tt>short[].class</tt></li>
     * 	<li><tt>byte.class</tt></li>
     * 	<li><tt>byte[].class</tt></li>
     * 	<li><tt>String.class</tt></li>
     * </ul>
     * 
     * <p>Please use <tt>getSimpleName()</tt> methode of <tt>Class</tt> object for the String representation.
     * @param code the DHCP option code
     * @return the Class object representing accepted types
     */
    public static Class getOptionFormat(byte code) {
    	OptionFormat format = _DHO_FORMATS.get(code);
    	if (format == null) {
    		return null;
    	}
    	switch (format) {
		case INET:
			return InetAddress.class;
		case INETS:
			return InetAddress[].class;
		case INT:
			return int.class;
		case SHORT:
			return short.class;
		case SHORTS:
			return short[].class;
		case BYTE:
			return byte.class;
		case BYTES:
			return byte[].class;
		case STRING:
			return String.class;
		default:
			return null;
    	}
    }

    /**
     * Simple method for converting from string to supported class format.
     * 
     * <p>Support values are:
     * <ul>
     *  <li>InetAddress, inet</li>
     * 	<li>InetAddress[], inets</li>
     * 	<li>int</li>
     * 	<li>short</li>
     * 	<li>short[], shorts</li>
     * 	<li>byte</li>
     * 	<li>byte[], bytes</li>
     * 	<li>String, string</li>
     * </ul>
     * @param className name of the data format (see above)
     * @return <tt>Class</tt> or <tt>null</tt> if not supported
     */
    public static Class string2Class(String className) {
    	if ("InetAddress".equals(className)) return InetAddress.class;
    	if ("inet".equals(className)) return InetAddress.class;
    	if ("InetAddress[]".equals(className)) return InetAddress[].class;
    	if ("inets".equals(className)) return InetAddress[].class;
    	if ("int".equals(className)) return int.class;
    	if ("short".equals(className)) return short.class;
    	if ("short[]".equals(className)) return short[].class;
    	if ("shorts".equals(className)) return short[].class;
    	if ("byte".equals(className)) return byte.class;
    	if ("byte[]".equals(className)) return byte[].class;
    	if ("bytes".equals(className)) return byte[].class;
    	if ("String".equals(className)) return String.class;
    	if ("string".equals(className)) return String.class;
    	return null;
    }
    
    /**
     * Parse an option from a pure string representation.
     * 
     * <P>The expected class is passed as a parameter, and can be provided by the 
     * <tt>string2Class()</tt> method from a string representation of the class.
     * 
     * <P>TODO examples
     * 
     * @param code DHCP option code
     * @param format expected Java Class after conversion
     * @param value string representation of the value
     * @return the DHCPOption object
     */
    public static DHCPOption parseNewOption(byte code, Class format, String value) {
    	if ((format == null) || (value == null)) {
    		throw new NullPointerException();
    	}

    	if (short.class.equals(format)) {								// short
    		return newOptionAsShort(code, (short)Integer.parseInt(value));
    	} else if (short[].class.equals(format)) {					// short[]
    		String[] listVal = value.split(" ");
    		short[] listShort = new short[listVal.length];
    		for (int i=0; i<listVal.length; i++) {
    			listShort[i] = (short) Integer.parseInt(listVal[i]);
    		}
    		return newOptionAsShorts(code, listShort);
    	} else if (int.class.equals(format)) {						// int
    		return newOptionAsInt(code, Integer.parseInt(value));
    	} else if (String.class.equals(format)) {						// String
    		return newOptionAsString(code, value);
    	} else if (byte.class.equals(format)) {						// byte
			return newOptionAsByte(code, (byte) Integer.parseInt(value));
			// TODO be explicit about BYTE allowed from -128 to 255 (unsigned int support)
    	} else if (byte[].class.equals(format)) {						// byte[]
    		value = value.replace(".", " ");
    		String[] listVal = value.split(" ");
    		byte[] listBytes = new byte[listVal.length];
    		for (int i=0; i<listVal.length; i++) {
    			listBytes[i] = (byte) Integer.parseInt(listVal[i]);
    		}
    		return new DHCPOption(code, listBytes);
    	} else if (InetAddress.class.equals(format)) {					// InetAddress
    		try {
    			return newOptionAsInetAddress(code, InetAddress.getByName(value));
    		} catch (UnknownHostException e) {
    			logger.log(Level.SEVERE, "Invalid address:"+value, e);
    			return null;
    		}
    	} else if (InetAddress[].class.equals(format)) {				// InetAddress[]
    		String[] listVal = value.split(" ");
    		InetAddress[] listInet = new InetAddress[listVal.length];
    		try {
	    		for (int i=0; i<listVal.length; i++) {
	    			listInet[i] = InetAddress.getByName(listVal[i]);
	    		}
    		} catch (UnknownHostException e) {
    			logger.log(Level.SEVERE, "Invalid address", e);
    			return null;
    		}
    		return newOptionAsInetAddresses(code, listInet);
    	}
    	return null;
    }
    // ----------------------------------------------------------------------
    // Internal constants for high-level option type conversions.
    //
    // formats of options
    //
    enum OptionFormat {
        INET,	// 4 bytes IP,				size = 4
        INETS,	// list of 4 bytes IP,		size = 4*n
        INT,	// 4 bytes integer,			size = 4
        SHORT,	// 2 bytes short,			size = 2
        SHORTS,	// list of 2 bytes shorts,	size = 2*n
        BYTE,	// 1 byte,					size = 1
        BYTES,	// list of bytes,			size = n
        STRING,	// string,					size = n
        //RELAYS	= 9;	// DHCP sub-options (rfc 3046)
        //ID		= 10;	// client identifier : byte (htype) + string (chaddr)
    	
    }
    
    //
    // list of formats by options
    //
    private static final Object[] _OPTION_FORMATS = {
            DHO_SUBNET_MASK,					OptionFormat.INET,
            DHO_TIME_OFFSET,					OptionFormat.INT,
            DHO_ROUTERS,						OptionFormat.INETS,
            DHO_TIME_SERVERS,					OptionFormat.INETS,
            DHO_NAME_SERVERS,					OptionFormat.INETS,
            DHO_DOMAIN_NAME_SERVERS,			OptionFormat.INETS,
            DHO_LOG_SERVERS,					OptionFormat.INETS,
            DHO_COOKIE_SERVERS,					OptionFormat.INETS,
            DHO_LPR_SERVERS,					OptionFormat.INETS,
            DHO_IMPRESS_SERVERS,				OptionFormat.INETS,
            DHO_RESOURCE_LOCATION_SERVERS,		OptionFormat.INETS,
            DHO_HOST_NAME,						OptionFormat.STRING,
            DHO_BOOT_SIZE,						OptionFormat.SHORT,
            DHO_MERIT_DUMP,						OptionFormat.STRING,
            DHO_DOMAIN_NAME,					OptionFormat.STRING,
            DHO_SWAP_SERVER,					OptionFormat.INET,
            DHO_ROOT_PATH,						OptionFormat.STRING,
            DHO_EXTENSIONS_PATH,				OptionFormat.STRING,
            DHO_IP_FORWARDING,					OptionFormat.BYTE,
            DHO_NON_LOCAL_SOURCE_ROUTING,		OptionFormat.BYTE,
            DHO_POLICY_FILTER,					OptionFormat.INETS,
            DHO_MAX_DGRAM_REASSEMBLY,			OptionFormat.SHORT,
            DHO_DEFAULT_IP_TTL,					OptionFormat.BYTE,
            DHO_PATH_MTU_AGING_TIMEOUT,			OptionFormat.INT,
            DHO_PATH_MTU_PLATEAU_TABLE,			OptionFormat.SHORTS,
            DHO_INTERFACE_MTU,					OptionFormat.SHORT,
            DHO_ALL_SUBNETS_LOCAL,				OptionFormat.BYTE,
            DHO_BROADCAST_ADDRESS,				OptionFormat.INET,
            DHO_PERFORM_MASK_DISCOVERY,			OptionFormat.BYTE,
            DHO_MASK_SUPPLIER,					OptionFormat.BYTE,
            DHO_ROUTER_DISCOVERY,				OptionFormat.BYTE,
            DHO_ROUTER_SOLICITATION_ADDRESS,	OptionFormat.INET,
            DHO_STATIC_ROUTES,					OptionFormat.INETS,
            DHO_TRAILER_ENCAPSULATION,			OptionFormat.BYTE,
            DHO_ARP_CACHE_TIMEOUT,				OptionFormat.INT,
            DHO_IEEE802_3_ENCAPSULATION,		OptionFormat.BYTE,
            DHO_DEFAULT_TCP_TTL,				OptionFormat.BYTE,
            DHO_TCP_KEEPALIVE_INTERVAL,			OptionFormat.INT,
            DHO_TCP_KEEPALIVE_GARBAGE,			OptionFormat.BYTE,
            DHO_NIS_SERVERS,					OptionFormat.INETS,
            DHO_NTP_SERVERS,					OptionFormat.INETS,
            DHO_NETBIOS_NAME_SERVERS,			OptionFormat.INETS,
            DHO_NETBIOS_DD_SERVER,				OptionFormat.INETS,
            DHO_NETBIOS_NODE_TYPE,				OptionFormat.BYTE,
            DHO_NETBIOS_SCOPE,					OptionFormat.STRING,
            DHO_FONT_SERVERS,					OptionFormat.INETS,
            DHO_X_DISPLAY_MANAGER,				OptionFormat.INETS,
            DHO_DHCP_REQUESTED_ADDRESS,			OptionFormat.INET,
            DHO_DHCP_LEASE_TIME,				OptionFormat.INT,
            DHO_DHCP_OPTION_OVERLOAD,			OptionFormat.BYTE,
            DHO_DHCP_MESSAGE_TYPE,				OptionFormat.BYTE,
            DHO_DHCP_SERVER_IDENTIFIER,			OptionFormat.INET,
            DHO_DHCP_PARAMETER_REQUEST_LIST,	OptionFormat.BYTES,
            DHO_DHCP_MESSAGE,					OptionFormat.STRING,
            DHO_DHCP_MAX_MESSAGE_SIZE,			OptionFormat.SHORT,
            DHO_DHCP_RENEWAL_TIME,				OptionFormat.INT,
            DHO_DHCP_REBINDING_TIME,			OptionFormat.INT,
            DHO_VENDOR_CLASS_IDENTIFIER,		OptionFormat.STRING,
            DHO_NWIP_DOMAIN_NAME,				OptionFormat.STRING,
            DHO_NISPLUS_DOMAIN,					OptionFormat.STRING,
            DHO_NISPLUS_SERVER,					OptionFormat.STRING,
            DHO_TFTP_SERVER,					OptionFormat.STRING,
            DHO_BOOTFILE,						OptionFormat.STRING,
            DHO_MOBILE_IP_HOME_AGENT,			OptionFormat.INETS,
            DHO_SMTP_SERVER,					OptionFormat.INETS,
            DHO_POP3_SERVER,					OptionFormat.INETS,
            DHO_NNTP_SERVER,					OptionFormat.INETS,
            DHO_WWW_SERVER,						OptionFormat.INETS,
            DHO_FINGER_SERVER,					OptionFormat.INETS,
            DHO_IRC_SERVER,						OptionFormat.INETS,
            DHO_STREETTALK_SERVER,				OptionFormat.INETS,
            DHO_STDA_SERVER,					OptionFormat.INETS,
            DHO_NDS_SERVERS,					OptionFormat.INETS,
            DHO_NDS_TREE_NAME,					OptionFormat.STRING,
            DHO_NDS_CONTEXT,					OptionFormat.STRING,
            DHO_CLIENT_LAST_TRANSACTION_TIME,	OptionFormat.INT,
            DHO_ASSOCIATED_IP,					OptionFormat.INETS,
            DHO_USER_AUTHENTICATION_PROTOCOL,	OptionFormat.STRING,
            DHO_AUTO_CONFIGURE,					OptionFormat.BYTE,
            DHO_NAME_SERVICE_SEARCH,			OptionFormat.SHORTS,
            DHO_SUBNET_SELECTION,				OptionFormat.INET,
            DHO_DOMAIN_SEARCH,					OptionFormat.STRING,
            
    };    
    static final Map<Byte, OptionFormat> _DHO_FORMATS = new LinkedHashMap<Byte, OptionFormat>();

    /*
     * preload at startup Maps with constants
     * allowing reverse lookup
     */
    static {
        // construct map of formats
        for (int i=0; i<_OPTION_FORMATS.length / 2; i++) {
            _DHO_FORMATS.put((Byte) _OPTION_FORMATS[i*2],(OptionFormat) _OPTION_FORMATS[i*2+1]);
        }
    }

    // ========================================================================
    // main: print DHCP options for Javadoc
    public static void main(String[] args) {
        String all     = "";
        String inet1   = "";
        String inets   = "";
        String int1    = "";
        String short1  = "";
        String shorts  = "";
        String byte1   = "";
        String bytes   = "";
        String string1 = "";

        for (Byte codeByte : _DHO_NAMES.keySet()) {
            byte code = codeByte.byteValue();
            String s = "";
            if (code != DHO_PAD && code != DHO_END) {
                s = " * " + _DHO_NAMES.get(codeByte) + '(' + (code & 0xFF) + ")\n";
            }
            
            all += s;
            if (_DHO_FORMATS.containsKey(codeByte)) {
	            switch (_DHO_FORMATS.get(codeByte)) {
	            	case INET:   inet1   += s; break;
	            	case INETS:  inets   += s; break;
	            	case INT:    int1    += s; break;
	            	case SHORT:  short1  += s; break;
	            	case SHORTS: shorts  += s; break;
	            	case BYTE:   byte1   += s; break;
	            	case BYTES:  bytes   += s; break;
	            	case STRING: string1 += s; break;
	            	default:
	            }
            }
        }

        System.out.println("---All codes---");
        System.out.println(all);
        System.out.println("---INET---");
        System.out.println(inet1);
        System.out.println("---INETS---");
        System.out.println(inets);
        System.out.println("---INT---");
        System.out.println(int1);
        System.out.println("---SHORT---");
        System.out.println(short1);
        System.out.println("---SHORTS---");
        System.out.println(shorts);
        System.out.println("---BYTE---");
        System.out.println(byte1);
        System.out.println("---BYTES---");
        System.out.println(bytes);
        System.out.println("---STRING---");
        System.out.println(string1);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -