public void sendReply(DHCPPacket request, byte requestType, byte[] reservedIP){
			DHCPPacket reply = new DHCPPacket();
			reply.setOp(Constants.BOOTREPLY)
				 .setHtype ((byte) 1)
				 .setHlen  ((byte) 6)
				 .setHops  ((byte) 0)
				 .setXid   (request.getXid())
				 .setSecs  (0)
				 .setBroadcastFlag(true)
				 .setCiaddr(0)
				 .setYiaddr(reservedIP)
				 .setSiaddr(dhcpServerIP)
				 .setGiaddr(0)
				 .setChaddr(request.getChaddr())
				 .setSname (0)
				 .setFile  (0)
				 .setCookie( );
			reply.addOption((byte)53, (byte)1, new byte[]{requestType})
				 .addOption((byte)1 , (byte)4, subnetmask   )
				 .addOption((byte)3 , (byte)4, gateway      )
				 .addOption((byte)6 , (byte)4, dns          )
				 .addOption((byte)54, (byte)4, serverid     );
			if(request.getOption((byte)53)[0] != 8){
				if(incrementalLease){
					if(!prev){
						try{
						reply.addOption((byte)58, (byte)4, minRenewal / 1000)
							 .addOption((byte)59, (byte)4, minRebinding / 1000)
							 .addOption((byte)51, (byte)4, minLease    / 1000);
						}catch(Exception e){ e.printStackTrace(); }
					}else{
						ByteArray hwArray = new ByteArray(request.getChaddr());
						reply.addOption((byte)58, (byte)4, db.get(hwArray).getRenewalTime() / 1000 )
							 .addOption((byte)59, (byte)4, db.get(hwArray).getRebindingTime()/ 1000)
							 .addOption((byte)51, (byte)4, db.get(hwArray).getLeaseTime()  / 1000 );
					}
				}else{
					 reply.addOption((byte)58, (byte)4, renewaltime / 1000 )
						  .addOption((byte)59, (byte)4, rebindingtime/ 1000)
						  .addOption((byte)51, (byte)4, leasetime   / 1000 );
				}
			}
			
			byte[] replydata = reply.array();
			ByteArray xidArray = new ByteArray(reply.getXid());
			if(messages.containsKey(xidArray))
				messages.get(xidArray).add(reply);
			else{
				MessageGroup newGroup = new MessageGroup();
				newGroup.add(reply);
				messages.put(xidArray, newGroup);
			}
			DatagramPacket replyPacket = new DatagramPacket(replydata, replydata.length);
			
			DatagramSocket socket;
			try {
				socket = new DatagramSocket();
				replyPacket.setPort(68);
				replyPacket.setAddress(InetAddress.getByAddress(new byte[]{(byte)255, (byte)255, (byte)255, (byte)255}));
				socket.setBroadcast(true);
				socket.send(replyPacket);
			} catch (     SocketException e) { error(e, null);
			} catch (UnknownHostException e) { error(e, null);
			} catch (         IOException e) {
				System.out.println("Error Sending Reply. Are you still connected?");
			}
		}