dhcpclient.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 99 行

JAVA
99
字号
/*
 * $Id: DHCPClient.java,v 1.1 2004/02/17 20:19:37 markhale Exp $
 */
package org.jnode.net.ipv4.dhcp;

import java.io.IOException;
import java.net.DatagramPacket;

import org.apache.log4j.Logger;
import org.jnode.driver.Device;
import org.jnode.driver.net.NetDeviceAPI;
import org.jnode.driver.net.NetworkException;
import org.jnode.net.ipv4.IPv4Address;
import org.jnode.net.ipv4.bootp.BOOTPClient;
import org.jnode.net.ipv4.bootp.BOOTPHeader;
import org.jnode.net.ipv4.util.Route;

/**
 * Console DHCP client.
 * @author markhale
 */
public class DHCPClient extends BOOTPClient {

	private final Logger log = Logger.getLogger(getClass());

	/**
	 * Create a DHCP discovery packet
	 */
	protected DatagramPacket createRequestPacket(BOOTPHeader hdr) throws IOException {
		return new DHCPMessage(hdr, DHCPMessage.DHCPDISCOVER).toDatagramPacket();
	}

	protected boolean processResponse(Device device, NetDeviceAPI api, int transactionID, DatagramPacket packet) throws IOException {
		DHCPMessage msg = new DHCPMessage(packet);
		BOOTPHeader hdr = msg.getHeader();
		if (hdr.getOpcode() != BOOTPHeader.BOOTREPLY) {
			// Not a response
			return false;
		}
		if (hdr.getTransactionID() != transactionID) {
			// Not for me
			return false;
		}

		// debug the DHCP message
		if(log.isDebugEnabled()) {
			log.debug("Got Client IP address  : " + hdr.getClientIPAddress());
			log.debug("Got Your IP address    : " + hdr.getYourIPAddress());
			log.debug("Got Server IP address  : " + hdr.getServerIPAddress());
			log.debug("Got Gateway IP address : " + hdr.getGatewayIPAddress());
			for(int n=1; n<255; n++) {
				byte[] value = msg.getOption(n);
				if(value != null) {
					if(value.length == 1)
						log.debug("Option "+n+" : " + (int)(value[0]));
					else if(value.length == 4)
						log.debug("Option "+n+" : " + new IPv4Address(value, 0).toString());
					else
						log.debug("Option "+n+" : " + new String(value));
				}
			}
		}

		switch(msg.getMessageType()) {
			case DHCPMessage.DHCPOFFER:
				byte[] serverID = msg.getOption(DHCPMessage.SERVER_IDENTIFIER_OPTION);
				byte[] requestedIP = hdr.getYourIPAddress().toInetAddress().getAddress();
				hdr = new BOOTPHeader(BOOTPHeader.BOOTREQUEST, transactionID, hdr.getClientIPAddress(), hdr.getClientHwAddress());
				msg = new DHCPMessage(hdr, DHCPMessage.DHCPREQUEST);
				msg.setOption(DHCPMessage.REQUESTED_IP_ADDRESS_OPTION, requestedIP);
				msg.setOption(DHCPMessage.SERVER_IDENTIFIER_OPTION, serverID);
				packet = msg.toDatagramPacket();
				packet.setAddress(IPv4Address.BROADCAST.toInetAddress());
				packet.setPort(SERVER_PORT);
				socket.send(packet);
				break;
			case DHCPMessage.DHCPACK:
				configureNetwork(device, msg);
				return true;
			case DHCPMessage.DHCPNAK:
				break;
		}
		return false;
	}

	/**
	 * Performs the actual configuration of a network device based on the settings in a DHCP message.
	 */
	protected void configureNetwork(Device device, DHCPMessage msg) throws NetworkException {
		configureNetwork(device, msg.getHeader());
		byte[] routerValue = msg.getOption(DHCPMessage.ROUTER_OPTION);
		if(routerValue != null && routerValue.length >= 4) {
			IPv4Address routerIP = new IPv4Address(routerValue, 0);
			log.info("Got Router IP address : " + routerIP);
			Route.addRoute(IPv4Address.ANY, routerIP, device);
		}
	}
}

⌨️ 快捷键说明

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