java 探测网络中是否有dhcp环境

最近工作有个小需求,探测网络环境中是否有dhcp服务器,实现记录如下

dhcp工作原理,详见百度百科

DHCP协议采用UDP作为传输协议,主机发送请求消息到DHCP服务器的67号端口,DHCP服务器回应应答消息给主机的68号端口。详细的交互过程如下图。


1.DHCP Client以广播的方式发出DHCP Discover报文。
2.所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文,所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文。
  DHCP Offer报文中“Your(Client) IP Address”字段就是DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址放在“option”字  段中以便DHCP Client区分不同的DHCP Server。DHCP Server在发出此报文后会存在一个已分配IP地址的纪录。
3.DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的DHCP Offer报文。
  DHCP Client会发出一个广播的DHCP Request报文,在选项字段中会加入选中的DHCP Server的IP地址和需要的IP地址。
4.DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如   果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息。
5.DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。如果可以使用,则DHCP Client成功获得IP地址并根据IP地址使用租期自动启    动续延过程;如果DHCP Client发现分配的IP地址已经被使用,则DHCP Client向DHCPServer发出DHCP Decline报文,通知DHCP Server禁用这个IP地址,然后DHCP    Client开始新的地址申请过程。
6.DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分  配。


[html] view plain copy
  1. 所以要实现java探测dhcp环境,只要模拟实现上述步骤1和2即可  

jar包 dhcp4java-1.00.jar api文档

实现过程  广播发送 DHCP Discover报文   收到响应如果报文中包含DHCP Offer则可以判断网络中有dhcp服务器。

官方sniffer example 实现不全,补充一下

实现代码:

[java] view plain copy
  1. import java.io.IOException;  
  2. import java.net.DatagramPacket;  
  3. import java.net.DatagramSocket;  
  4. import java.net.InetAddress;  
  5. import java.net.SocketException;  
  6. import java.util.Random;  
  7.   
  8. import org.dhcp4java.DHCPConstants;  
  9. import org.dhcp4java.DHCPPacket;  
  10.   
  11. /** 
  12.  * A simple DHCP sniffer Test. 
  13.  * 
  14.  * @author lip 
  15.  * @version 1.00 
  16.  */  
  17. public class DHCPSnifferTest {  
  18.     private DHCPSnifferTest() {  
  19.         throw new UnsupportedOperationException();  
  20.     }  
  21.       
  22.     private static byte[] macAddress = {  
  23.         (byte0x00, (byte0x01, (byte0x02, (byte0x03, (byte0x04, (byte0x05  
  24.     };  
  25.       
  26.     public static String bytesToHexString(byte[] src){         
  27.         StringBuilder stringBuilder = new StringBuilder();         
  28.         if (src == null || src.length <= 0) {         
  29.             return null;         
  30.         }         
  31.         for (int i = 0; i < src.length; i++) {         
  32.             int v = src[i] & 0xFF;         
  33.             String hv = Integer.toHexString(v);         
  34.             if (hv.length() < 2) {         
  35.                 stringBuilder.append(0);         
  36.             }         
  37.             stringBuilder.append(hv);         
  38.         }         
  39.         return stringBuilder.toString();         
  40.     }  
  41.   
  42.     public static void main(String[] args) throws SocketException {  
  43.         DHCPPacket discover = new DHCPPacket();  
  44.         discover.setHtype(DHCPConstants.HTYPE_ETHER);  
  45.         discover.setHlen((byte6);  
  46.         discover.setHops((byte0);  
  47.         discover.setXid( (new Random()).nextInt() );  
  48.         discover.setSecs((short0);  
  49.         discover.setFlags((short0);  
  50.         discover.setChaddr(macAddress);  
  51.         discover.setDHCPMessageType(DHCPConstants.DHCPDISCOVER);  
  52.           
  53.         DatagramSocket socket;  
  54.         try {  
  55.             socket = new DatagramSocket(DHCPConstants.BOOTP_REPLY_PORT);  
  56.             DatagramPacket sendPacket = new DatagramPacket(discover.serialize(),  
  57.                     discover.serialize().length,  
  58.                     InetAddress.getByName("255.255.255.255"), 67);  
  59.             socket.send(sendPacket);  
  60.               
  61.             DatagramPacket pac = new DatagramPacket(new byte[1500], 1500);  
  62.             DHCPPacket dhcp;  
  63.             socket.receive(pac);  
  64.             dhcp = DHCPPacket.getPacket(pac);  
  65.             //返回报文包含macAddress  
  66.             if (bytesToHexString(dhcp.getChaddr()).contains(  
  67.                     bytesToHexString(macAddress))) {  
  68.                 System.out.println("Discover dhcp server:"+dhcp  
  69.                         .getOption(DHCPConstants.DHO_DOMAIN_NAME_SERVERS));  
  70.             }  
  71.         } catch (IOException e) {  
  72.             // TODO Auto-generated catch block  
  73.             e.printStackTrace();  
  74.         }  
  75.           
  76.           
  77.               
  78.     }  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值