您的位置:首页 > 编程语言 > Java开发

java实现DHCP协议获取ip地址

2016-02-14 13:19 931 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dhcp