java实现DHCP协议获取ip地址


DHCP是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段,在RFC 2131中有详细的描述。

DHCP几个概念:

DHCP Client:DHCP客户端,通过DHCP协议请求IP地址的客户端。DHCP客户端是接口级的概念,如果一个主机有多个以太接口,则该主机上的每个接口都可以配置成一个DHCP 客户端。交换机上每个Vlan接口也可以配置成一个DHCP客户端。

DHCP Server:DHCP 服务端,负责为DHCP客户端提供IP地址,并且负责管理分配的IP地址。

DHCP Relay:DHCP中继器,DHCP客户端跨网段申请IP地址的时候,实现DHCP报文的转发功能。

DHCP Security:DHCP安全特性,实现合法用户IP地址表的管理功能

DHCP Snooping:DHCP监听,记录通过二层设备申请到IP地址的用户信息

DHCP工作原理:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Random;

import org.dhcp4java.DHCPConstants;
import org.dhcp4java.DHCPPacket;
import org.dhcp4java.HardwareAddress;

public class DHCPSnifferTest {
  
//   物理地址. E0-AC-CB-83-35-FA
//	private static byte[] macAddress = {
//        (byte) 0xE2, (byte) 0xAC, (byte) 0xCB, (byte) 0x83, (byte) 0x35, (byte) 0xFA
//    };
	
	public static String bytesToHexString(byte[] src){       
        StringBuilder stringBuilder = new StringBuilder();       
        if (src == null || src.length <= 0) {       
            return null;       
        }       
        for (int i = 0; i < src.length; i++) {       
            int v = src[i] & 0xFF;       
            String hv = Integer.toHexString(v);       
            if (hv.length() < 2) {       
                stringBuilder.append(0);       
            }       
            stringBuilder.append(hv);       
        }       
        return stringBuilder.toString();       
    }
	

    public static void main(String[] args) throws SocketException {
    	
    	//修改下面的地址为你的物理地址  使用  ipconfig/all 命令
    	byte []macAddress=HardwareAddress.getHardwareAddressByString("E0:AC:CB:83:35:FA").getHardwareAddress();
    	DHCPPacket discover = new DHCPPacket();
    	discover.setOp(DHCPConstants.DHCPDISCOVER); 
        discover.setHtype(DHCPConstants.HTYPE_ETHER);
        discover.setHlen((byte) 6);
        discover.setHops((byte) 0);
        discover.setXid(123);
        discover.setSecs((short) 10000);
        discover.setFlags((short) 0);
        discover.setChaddr(macAddress);
        discover.setDHCPMessageType(DHCPConstants.DHCPDISCOVER);
        
        DatagramSocket socket = null;
		try {
			
			socket = new DatagramSocket(DHCPConstants.BOOTP_REPLY_PORT);
			//socket.setSoTimeout(5000);
			DatagramPacket sendPacket = new DatagramPacket(discover.serialize(),
					discover.serialize().length,
					InetAddress.getByName("255.255.255.255"), 67);
			DatagramPacket pac = new DatagramPacket(new byte[1500], 1500);
			DHCPPacket dhcp;
			
			socket.send(sendPacket);
			System.out.println("send.....");
			socket.receive(pac);
			dhcp = DHCPPacket.getPacket(pac);
			
			//返回报文包含macAddress
			if (bytesToHexString(dhcp.getChaddr()).contains(
					bytesToHexString(macAddress))) {
				System.out.println(dhcp);
			} 
		} catch (IOException e) {
			try {
				socket.close();
			} catch (Exception e1) {
			}
			e.printStackTrace();
		}
        
        
        	
    }
}

获取物理地址命令  ,有多个物理地址,注意选择正确的地址



工程下载链接 

链接: http://pan.baidu.com/s/1dEmbyX7 密码: pu7r



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值