如何运行DHCP java代码 [英] How do run a DHCP java code

查看:66
本文介绍了如何运行DHCP java代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码

* DHCPServer.java

* DHCPClient.java

* DHCPMessage.java

* DHCPOptions.java



i hav在我的命令promt中使用javac符合

它没有错误

i运行代码

bt我不知道代码如何工作

更具体我不知道如何运行它



DHCPServer.java

i have tis following code
* DHCPServer.java
* DHCPClient.java
* DHCPMessage.java
* DHCPOptions.java

i hav complied in my command promt using javac
it has no error
i run the code
bt i dont know how the code works
to be more specific i dont know how to run it

DHCPServer.java

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Arrays;

public class DHCPServer {
        private static final int MAX_BUFFER_SIZE = 1024; // 1024 bytes
        private int listenPort = 67;//1337;

        public DHCPServer(int servePort) {
                listenPort = servePort;
                new DHCPServer();
        }

        public DHCPServer() {
                //System.out.println("Opening UDP Socket On Port: " + listenPort);

                DatagramSocket socket = null;
                try {
                        
                        socket = new DatagramSocket(listenPort);  // ipaddress? throws socket exception

                        byte[] payload = new byte[MAX_BUFFER_SIZE];
                        int length = 6;
                        DatagramPacket p = new DatagramPacket(payload, length);
                        //System.out.println("Success! Now listening on port " + listenPort + "...");
                        System.out.println("Listening on port " + listenPort + "...");
                        
                        //server is always listening
                        boolean listening = true;
                        while (listening) {
                                socket.receive(p); //throws i/o exception
                                
                                System.out.println("Connection established from " + p.getAddress());
                        
                                System.out.println("Data Received: " + Arrays.toString(p.getData()));
                        }
                } catch (SocketException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }

        }

        /**
         * @param args
         */
        public static void main(String[] args) {
                DHCPServer server;
                if (args.length >= 1) {
                        server = new DHCPServer(Integer.parseInt(args[0]));
                } else {
                        server = new DHCPServer();
                }

        }

}





DHCPClient.java



DHCPClient.java

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Arrays;

public class DHCPClient {
	private static final int MAX_BUFFER_SIZE = 1024; // 1024 bytes
	private int listenPort =  68;//1338;
	private String serverIP = "127.0.0.1";
	private int serverPort =  67;//1337;

	/*
	 * public DHCPClient(int servePort) { listenPort = servePort; new
	 * DHCPServer(); }
	 */

	public DHCPClient() {
		System.out.println("Connecting to DHCPServer at " + serverIP + " on port " + serverPort + "...");

		DatagramSocket socket = null;
		try {
			socket = new DatagramSocket(listenPort);  // ipaddress? throws socket exception

			byte[] payload = new byte[MAX_BUFFER_SIZE];
			int length = 6;
			payload[0] = 'h';
			payload[1] = '3';
			payload[2] = 'l';
			payload[3] = 'l';
			payload[4] = 'o';
			payload[5] = '!';
			DatagramPacket p = new DatagramPacket(payload, length, InetAddress.getByName(serverIP), serverPort);
			socket.send(p); //throws i/o exception
			socket.send(p);
			System.out.println("Connection Established Successfully!");
			System.out.println("Sending data: " + Arrays.toString(p.getData()));
			

		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DHCPClient client;
		/*
		 * if (args.length >= 1) { server = new
		 * DHCPClient(Integer.parseInt(args[0])); } else {
		 */
		client = new DHCPClient();
		//DHCPMessage msgTest = new DHCPMessage();
		printMacAddress();
		// }

	}
	
	public static byte[] getMacAddress() {
		byte[] mac = null;
		try {
			InetAddress address = InetAddress.getLocalHost();

			/*
			 * Get NetworkInterface for the current host and then read the
			 * hardware address.
			 */
			NetworkInterface ni = NetworkInterface.getByInetAddress(address);
			mac = ni.getHardwareAddress();

			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		}
		assert(mac != null);
		return mac;
	}
	
	public static void printMacAddress() {
		try {
			InetAddress address = InetAddress.getLocalHost();

			/*
			 * Get NetworkInterface for the current host and then read the
			 * hardware address.
			 */
			NetworkInterface ni = NetworkInterface.getByInetAddress(address);
			byte[] mac = ni.getHardwareAddress();

			/*
			 * Extract each array of mac address and convert it to hexa with the
			 * . * following format 08-00-27-DC-4A-9E.
			 */
			for (int i = 0; i < mac.length; i++) {
				System.out.format("%02X%s", mac[i], (i < mac.length - 1) ? "-"
						: "");
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}

}





DHCPMessage.java



DHCPMessage.java

import java.net.Inet4Address;
import java.net.InetAddress;

/**
 * This class represents a DHCP application level message packet 
 */

/**
 * @author Laivz
 *
 */
public class DHCPMessage {
	private static final int BOOTREQUEST = 1;
	private static final int BOOTREPLY = 2;
	private static final int DHCPREQUEST = 1;
	private static final int DHCPREPLY = 2;
	private static final int ETHERNET10MB = 1;
	
	//Operation Code:
	//Specifies the general type of message
	private byte op; 
	
	//Hardware Type:
	//Specifies the type of hardware used for the local network
	private byte hType; 
	
	//Hardware Address Length: 
	//Specifies how long hardware addresses are in this message. 
	private byte hLen;
	
	//Hops: 
	private byte hops;
	
	//Transaction Identifier: (32-bit)
	//Identification field generated by client
	//private byte[] xid = new byte[3];
	private int xid;
	
	//Seconds: (16-bit)
	//Number of seconds elapsed since a client began an attempt to acquire or renew a lease. 
	//private byte[] secs = new byte[1];
	private short secs;
	
	//Flags: (16-bit)
	//1bit broadcast flag (0-1)
	//15 bit reserverd
	//private byte[] flags = new byte[1];
	private short flags;
	
	//Client IP Address: (32-bit)
	private byte[] cIAddr;
	//private InetAddress cIAddr = new Inet4Address();

	//"Your" IP Address: (32-bit)
	private byte[] yIAddr;
	//Server IP Address: (32-bit)
	private byte[] sIAddr;
	//Gateway IP Address: (32-bit)
	private byte[] gIAddr;
	
	//Client Hardware Address: (128-bit : 16 bytes)
	private byte[] cHAddr;
	
	//Server Name: (512-bit : 64 bytes)
	private byte[] sName;
	
	//Boot Filename: (1024-bit : 128 bytes)
	private byte[] file;
	
	//Options: (variable)
	private DHCPOptions options;
	
	

	public DHCPMessage() {
		cIAddr = new byte[4];
		yIAddr = new byte[4];
		sIAddr = new byte[4];
		gIAddr = new byte[4];
		cHAddr = new byte[16];
		sName = new byte[64];
		file = new byte[128];
		options = new DHCPOptions();

		this.printMessage();
	}
	
	public byte[] discoverMsg(byte[] cMacAddress) {
		op = DHCPREQUEST;
		hType = ETHERNET10MB; // (0x1) 10Mb Ethernet
		hLen = 6; // (0x6)
		hops = 0; // (0x0)
		xid = 556223005; // (0x21274A1D)
		secs = 0;  // (0x0)
		flags = 0; // (0x0)
		// DHCP: 0............... = No Broadcast

		cIAddr = new byte[] { 0, 0, 0, 0 }; // 0.0.0.0
		yIAddr = new byte[] { 0, 0, 0, 0 }; // 0.0.0.0
		sIAddr = new byte[] { 0, 0, 0, 0 }; // 0.0.0.0
		gIAddr = new byte[] { 0, 0, 0, 0 }; // 0.0.0.0
		cHAddr = cMacAddress; // 08002B2ED85E
		sName = new byte[sName.length]; // <Blank>
		file = new byte[file.length]; // <Blank>
		// DHCP: Magic Cookie = [OK]
		// DHCP: Option Field (options)
		// DHCP: DHCP Message Type = DHCP Discover
		// DHCP: Client-identifier = (Type: 1) 08 00 2b 2e d8 5e
		// DHCP: Host Name = JUMBO-WS
		// DHCP: Parameter Request List = (Length: 7) 01 0f 03 2c 2e 2f 06
		// DHCP: End of this option field

		return this.externalize();
	}
	
	/**
	 * Converts a DHCPMessage object to a byte array.
	 * @return  a byte array with   information from DHCPMessage object.
	 */
	public byte[] externalize() {
		int staticSize = 236;
		byte[] options = this.options.externalize();
		int size = staticSize + options.length;
		byte[] msg = new byte[size];
		
		//add each field to the msg array
		//single bytes
		msg[0] = this.op;
		msg[1] = this.hType;
		msg[2] = this.hLen;
		msg[3] = this.hops;
		
		//add multibytes
		for (int i=0; i < 4; i++) msg[4+i] = inttobytes(xid)[i];
		for (int i=0; i < 2; i++) msg[8+i] = shorttobytes(secs)[i];
		for (int i=0; i < 2; i++) msg[10+i] = shorttobytes(flags)[i];
		for (int i=0; i < 4; i++) msg[12+i] = cIAddr[i];
		for (int i=0; i < 4; i++) msg[16+i] = yIAddr[i];
		for (int i=0; i < 4; i++) msg[20+i] = sIAddr[i];
		for (int i=0; i < 4; i++) msg[24+i] = gIAddr[i];
		for (int i=0; i < 16; i++) msg[28+i] = cHAddr[i];
		for (int i=0; i < 64; i++) msg[44+i] = sName[i];
		for (int i=0; i < 128; i++) msg[108+i] = file[i];
		
		//add options
		for (int i=0; i < options.length; i++) msg[staticSize+i] = options[i];
      
		return msg;
	}

	public byte getOp() {
		return op;
	}

	public void setOp(byte op) {
		this.op = op;
	}

	public byte getHType() {
		return hType;
	}

	public void setHType(byte type) {
		hType = type;
	}

	public byte getHLen() {
		return hLen;
	}

	public void setHLen(byte len) {
		hLen = len;
	}

	public byte getHops() {
		return hops;
	}

	public void setHops(byte hops) {
		this.hops = hops;
	}

	public int getXid() {
		return xid;
	}

	public void setXid(int xid) {
		this.xid = xid;
	}

	public short getSecs() {
		return secs;
	}

	public void setSecs(short secs) {
		this.secs = secs;
	}

	public short getFlags() {
		return flags;
	}

	public void setFlags(short flags) {
		this.flags = flags;
	}

	public byte[] getCIAddr() {
		return cIAddr;
	}

	public void setCIAddr(byte[] addr) {
		cIAddr = addr;
	}

	public byte[] getYIAddr() {
		return yIAddr;
	}

	public void setYIAddr(byte[] addr) {
		yIAddr = addr;
	}

	public byte[] getSIAddr() {
		return sIAddr;
	}

	public void setSIAddr(byte[] addr) {
		sIAddr = addr;
	}

	public byte[] getGIAddr() {
		return gIAddr;
	}

	public void setGIAddr(byte[] addr) {
		gIAddr = addr;
	}

	public byte[] getCHAddr() {
		return cHAddr;
	}

	public void setCHAddr(byte[] addr) {
		cHAddr = addr;
	}

	public byte[] getSName() {
		return sName;
	}

	public void setSName(byte[] name) {
		sName = name;
	}

	public byte[] getFile() {
		return file;
	}

	public void setFile(byte[] file) {
		this.file = file;
	}

	public byte[] getOptions() {
		return options.externalize();
	}

	//no set options yet...
	/*public void setOptions(byte[] options) {
		this.options = options;
	}*/
	
	public void printMessage() {
		System.out.println(this.toString());
	}
	
	@Override
	public String toString() {
		String msg = new String();
		
		msg += "Operation Code: " + this.op + "\n";
		msg += "Hardware Type: " + this.hType  + "\n";
		msg += "Hardware Length: " + this.hLen  + "\n";
		msg += "Hops: " + this.hops + "\n";
		
		msg += Integer.toString(xid) + "\n";
		msg += Short.toString(secs) + "\n";
		msg += Short.toString(flags) + "\n";
		msg += cIAddr.toString() + "\n";
		msg += yIAddr.toString() + "\n";
	    msg += sIAddr.toString() + "\n";
		 msg += gIAddr.toString() + "\n";
		msg += cHAddr.toString() + "\n";
		msg += sName.toString() + "\n";
		 msg += file.toString() + "\n";
		 
		 msg += options.toString() + "\n";
		
		//add options
		 assert(file != null);
		 assert (options != null);
		//msg += options.toString();
		
		//return super.toString();
		return msg;
	}
	
	private byte[] inttobytes(int i){
		byte[] dword = new byte[4];
		dword[0] = (byte) ((i >> 24) & 0x000000FF);
		dword[1] = (byte) ((i >> 16) & 0x000000FF);
		dword[2] = (byte) ((i >> 8) & 0x000000FF);
		dword[3] = (byte) (i & 0x00FF);
		return dword;
	}
	
	private byte[] shorttobytes(short i){
		byte[] b = new byte[2];
		b[0] = (byte) ((i >> 8) & 0x000000FF);
		b[1] = (byte) (i & 0x00FF);
		return b;
	}
	
}





DHCPOptions.java



DHCPOptions.java

import java.util.Hashtable;
import java.util.LinkedList;



/**
 * This class represents a hash table of options for a DHCP message. 
 * Its purpose is to ease option handling such as add, remove, or change.
 * @author Laivz
 *
 */
public class DHCPOptions {
	//DHCP Message Types
	public static final int DHCPDISCOVER = 1;
	public static final int DHCPOFFER = 2;
	public static final int DHCPREQUEST = 3;
	public static final int DHCPDECLINE = 4;
	public static final int DHCPACK = 5;
	public static final int DHCPNAK = 6;
	public static final int DHCPRELEASE = 7;
	
	//DHCP Option Identifiers
	public static final int DHCPMESSAGETYPE = 53;
	
	
	//private LinkedList<byte[]> options = new LinkedList<byte[]>();
	private Hashtable<Integer,byte[]> options;
	
	public DHCPOptions() {
		 options = new Hashtable<Integer, byte[]>();
	}
	
	public byte[] getOption(int optionID) {
		return options.get(optionID);
	}
	
	public void setOption(int optionID, byte[] option) {
		options.put(optionID, option);
	}
	
	public byte[] getOptionData(int optionID) {
		byte[] option = options.get(optionID);
		byte[] optionData = new byte[option.length-2];
		for (int i=0; i < optionData.length; i++)  optionData[i] = option[2+i];
		return optionData;
	}
	
	public void setOptionData(int optionID, byte[] optionData) {
		byte[] option = new byte[2+optionData.length];
		option[0] = (byte) optionID;
		option[1] = (byte) optionData.length;
		for (int i=0; i < optionData.length; i++) option[2+i] = optionData[i];
		options.put(optionID, option);
	}
	public void printOption (int optionID) {
		String output = new String("");
		if (options.get(optionID) != null) {
			byte[] option = options.get(optionID);
			for (int i=0; i < option.length; i++) {
				output += option[i]  +
						(i == option.length-1 ? "" : ","); 
			}
		} else {
			output = "<Empty>";
		}
		System.out.println(output);
	}
	
	public void printOptions () {
		for (byte[] option : options.values()) {
			printOption(option[0]);
		}
	}
	
	

	public static void main (String[] args) {
		DHCPOptions test = new DHCPOptions();
	
		//test.printOptions();
	}

	public byte[] externalize() {
		
		//get size
		int totalBytes = 0;
		for (byte[] option : this.options.values()) {
			totalBytes += option.length;
		}
		
		byte[] options = new byte[totalBytes];
		
		//copy bytes
		int bytes = 0;
		for (byte[] option : this.options.values()) {
			for (int i=0; i < option.length; i++) {
				options[bytes+i] = option[i];
			}
			bytes += option.length;
		}
		return options;
	}
	
}

推荐答案

The code looks to be incomplete. Go find the person the person that wrote this code and ask them.



Seriously.
The code looks to be incomplete. Go find the person the person that wrote this code and ask them.

Seriously.


这篇关于如何运行DHCP java代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆