@SuppressWarnings("static-access")
	private void manejarRequest() throws UnknownHostException, IOException {
		PaqueteDHCP data = new PaqueteDHCP();
		String TempIP = new String();
		byte[] unicast = null;

		// Ingresamos valores al data para hacer el DHCPACK
		OpcionDHCP opServ = pack.existInOption(54);

		if (opServ.getIntOption() == 54) { // si existe el identificador del
											// servidor es respuesta a un offer
			InetAddress idServidor = InetAddress.getByAddress(opServ
					.getValues());
			if (idServidor.equals(InetAddress.getLocalHost())) {
				// SI escogio este servidor, entonces continua
				// Confiamos en que el cliente envia la direccion ofrecida en la
				// opcion IP Request
				// if(database.existeCliente(pack.getStringHexa(pack.getCHADDR())))
				TempIP = database.getIPdeMAC(pack.getStringHexa(pack
						.getCHADDR()));
				if (TempIP == null) {

					TempIP = getRequestedIP(pack);
				} 
			} else {
				// No escogio este servidor entonces se queda callado
				System.out.println("No pregunta a este servidor sino a "+idServidor.toString());


				return;
			}

		} else {// No tiene el id del servidor por ende no es respuesta a un
				// offer
			String ipPedida = getRequestedIP(pack);

			if (database.existeCliente(pack.getStringHexa(pack.getCHADDR()))) {

				TempIP = database.getIPdeMAC(pack.getStringHexa(pack
						.getCHADDR()));
			} else {
				System.out.println("DESCONOCIDO" + TempIP);
				return;
			}// Si no existe en la base de datos se queda callado

			if (ipPedida == null) {// Esta en RENEWING state no vienen ni ip
									// request ni server id
				// Se confia en que tiene la direccion correcta que es la que yo
				// tengo en la base de datos.
				// se hace unicast:

				unicast = pack.getCIADDR();
			} else if (!ipPedida.equals(TempIP)) { // esta mal le envio un NAK
				sendNak();
				return;
			}

		}
		int subred = database.identificarSubRed(TempIP);
		if (subred != -1) {
			data.setOP((byte) 0x02);
			data.setHTYPE(pack.getHTYPE());
			data.setHLEN(pack.getHLEN());
			data.setHOPS((byte) 0x00);
			data.setXID(pack.getXID());
			byte[] a = { hexToByte("00"), hexToByte("00") };
			data.setSECS(a);
			data.setFLAGS(pack.getFLAGS());
			byte[] b = { hexToByte("00"), hexToByte("00"), hexToByte("00"),
					hexToByte("00") };
			data.setCIADDR(b);
			/*
			 * if(database.existeCliente(pack.getStringHexa(pack. getCHADDR())))
			 * TempIP = database.getIPdeMAC(pack.getStringHexa
			 * (pack.getCHADDR())); else TempIP = database.getIPLibre
			 * (pack.getStringHexa(pack.getCHADDR()));
			 */
			data.setYIADDR(pack.getIPOfStr(TempIP));
			data.setSIADDR(b);
			data.setGIADDR(b);
			data.setCHADDR(pack.getCHADDR());
			data.setMagicCookie(pack.getMagicCookie());

			// Relleno de las opciones del DHCP-ACK
			byte[] opt1 = new byte[3];
			// ponemos las opciones
			opt1[0] = (hexToByte(Integer.toHexString(53))); // DHCP Message Type
			opt1[1] = (hexToByte(Integer.toHexString(1))); // lenght
			opt1[2] = (hexToByte(Integer.toHexString(PaqueteDHCP.ACK))); // DCP
																			// ACK
			data.addDHCPOPTION(opt1);

			byte[] opt2 = new byte[6];
			opt2[0] = (hexToByte(Integer.toHexString(1))); // Subnet Mask
			opt2[1] = (hexToByte(Integer.toHexString(4))); // lenght
			byte[] aux = new byte[4];
			aux = pack.getIPOfStr(database.getMascara().get(
					database.identificarSubRed(TempIP)));// máscara
			opt2[2] = aux[0];
			opt2[3] = aux[1];
			opt2[4] = aux[2];
			opt2[5] = aux[3];
			data.addDHCPOPTION(opt2);

			opt2[0] = (hexToByte(Integer.toHexString(3))); // opción router
			opt2[1] = (hexToByte(Integer.toHexString(4))); // lenght
			aux = pack.getIPOfStr(database.getGateway().get(
					database.identificarSubRed(TempIP)));// Gateway
			opt2[2] = aux[0];
			opt2[3] = aux[1];
			opt2[4] = aux[2];
			opt2[5] = aux[3];
			data.addDHCPOPTION(opt2);

			opt2[0] = (hexToByte(Integer.toHexString(51))); // IP Address Lease
															// Time
			opt2[1] = (hexToByte(Integer.toHexString(4))); // lenght
			byte[] leaseTime = fragmentarInt(database.getLease());
			opt2[2] = leaseTime[0];
			opt2[3] = leaseTime[1];
			opt2[4] = leaseTime[2];
			opt2[5] = leaseTime[3];
			data.addDHCPOPTION(opt2);

			opt2[0] = (hexToByte(Integer.toHexString(6))); // Domain Name server
			opt2[1] = (hexToByte(Integer.toHexString(4))); // lenght
			aux = pack.getIPOfStr(database.getDns().get(
					DHCPDatabase.getInstance().identificarSubRed(TempIP)));
			opt2[2] = aux[0];
			opt2[3] = aux[1];
			opt2[4] = aux[2];
			opt2[5] = aux[3];
			data.addDHCPOPTION(opt2);

			String miIp = InetAddress.getLocalHost().getHostAddress();
			byte[] ipServer = pack.getIPOfStr(miIp);
			opt2[0] = (hexToByte(Integer.toHexString(54)));// Server Identifier
			opt2[1] = (hexToByte(Integer.toHexString(4))); // lenght
			opt2[2] = ipServer[0]; // Server DHCP
			opt2[3] = ipServer[1]; // Server DHCP
			opt2[4] = ipServer[2]; // Server DHCP
			opt2[5] = ipServer[3]; // Server DHCP
			data.addDHCPOPTION(opt2);
			data.finalizarDatagrama(); // Finalizamoa el datagrama

			byte[] broadcast = { hexToByte("FF"), hexToByte("FF"),
					hexToByte("FF"), hexToByte("FF") };// Broadcast
			if (!IPdesdeByte(pack.getGIADDR()).equals("0.0.0.0")) {
				broadcast = pack.getGIADDR();
			}
			DatagramPacket ep = null;
			if (unicast == null)
				ep = new DatagramPacket(data.getData(), data.getLengthData(),
						InetAddress.getByAddress(broadcast), 68);
			else
				ep = new DatagramPacket(data.getData(), data.getLengthData(),
						InetAddress.getByAddress(unicast), 68);
			socket.send(ep);
			System.out.println("ACK " + pack.getStringHexa(pack.getCHADDR())
					+ "IP OFRECIDA: " + TempIP);
			DHCPlog.reportar("Se envió DHCP_ACK a: ["
					+ pack.getStringHexa(pack.getCHADDR()) + "] con la IP: ["
					+ TempIP + "] || FECHA: " + new Date());

		} else {
			System.out.println("DESCONOCIDO: " + TempIP);
		}
	}