private boolean sendMessage(
      String status, DHCPMessage outMessage, DHCPSocket socket, int xid, int type) {
    outMessage.setOp((byte) 1);
    outMessage.setHtype((byte) 1);
    outMessage.setHlen((byte) 6);
    outMessage.setHops((byte) 0);
    outMessage.setXid(xid);
    outMessage.setSecs((short) 0);
    if (type == 1 || type == 3) {
      outMessage.setFlags((short) -32768);
    } else {
      outMessage.setFlags((short) 0);
    }
    byte initAddr[] = new byte[4];
    for (int i = 0; i < 4; i++) initAddr[i] = 0;

    outMessage.setCiaddr(initAddr);
    outMessage.setYiaddr(initAddr);
    outMessage.setSiaddr(initAddr);
    outMessage.setGiaddr(initAddr);
    byte mtype[] = new byte[1];
    mtype[0] = (byte) type;
    outMessage.setOption(53, mtype);
    outMessage.setOption(51, intToBytes(1));
    try {
      socket.send(outMessage);
    } catch (IOException ie) {
      status = ie.getMessage();
      return false;
    }
    return true;
  }
 private DHCPSocket openSocket(DHCPSocket s) {
   try {
     s = new DHCPSocket(68);
   } catch (SocketException se) {
     if (s != null) s.close();
     lastError = se.getMessage();
     return null;
   }
   return s;
 }
  private Object[] acquireAddress(int xid, byte hwaddr[], int sleepTime) {
    Object results[] = new Object[5];
    results[0] = "n/a";
    results[1] = String.valueOf(0);
    results[2] = "error";
    results[3] = "no data";
    results[4] = "no data";
    int releaseTime = -1;
    DHCPSocket socket = null;
    DHCPMessage outMessage = new DHCPMessage();
    DHCPMessage replyMessage = new DHCPMessage();
    byte offeredAddr[] = new byte[4];
    byte backupAddr[] = new byte[4];

    Random r = new Random();

    if ((socket = openSocket(socket)) == null) {
      results[3] = results[4] = lastError;
      return results;
    }
    outMessage.setChaddr(hwaddr);
    if (IP.length() > 0) {
      outMessage.setOption(50, stringToIP(IP));
    }
    for (int i = 0; i < 10; i++) {
      if (!sendMessage(lastError, outMessage, socket, xid, 1)) {
        results[3] = results[4] = lastError;
        socket.close();
        return results;
      }

      try {
        Thread.sleep(sleepTime);
      } catch (InterruptedException e) {

      }

      if (socket.receive(replyMessage)) {
        if (checkOffer(replyMessage, xid)) {
          offeredAddr = replyMessage.getYiaddr();
          System.arraycopy(offeredAddr, 0, backupAddr, 0, 4);
          break;
        }
        if (unavailable) {
          results[3] = results[4] = lastError;
          socket.close();
          return results;
        }
      }
      if (i == 9) {
        results[3] = results[4] = "Timed out waiting for DHCPOFFER";
        socket.close();
        return results;
      }
    }

    releaseTime = 1;
    outMessage.setOption(54, replyMessage.getOption(54));
    sendMessage(lastError, outMessage, socket, xid, 3, offeredAddr);
    if (!socket.receive(replyMessage)) {
      results[3] = results[4] = "Timed out waiting for DHCPACK";
      socket.close();
      return results;
    }
    if (replyMessage.getXid() != xid) {
      results[3] = results[4] = "Received invalid DHCPACK from server";
      socket.close();
      return results;
    }

    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {

    }

    outMessage.setCiaddr(backupAddr);
    outMessage.setOption(50, new byte[4]);
    outMessage.setOption(51, new byte[4]);
    outMessage.setOption(54, replyMessage.getOption(54));
    sendMessage(lastError, outMessage, socket, r.nextInt(), 7);
    socket.close();
    long totalDuration = System.currentTimeMillis() - startTime;
    String stateString =
        (new StringBuilder()).append("leased address ").append(ipToString(backupAddr)).toString();
    String duration = (float) totalDuration / 1000F + " sec";
    results[0] = results[1] = duration;
    results[2] = "ok";
    results[3] =
        (new StringBuilder()).append("leased address ").append(ipToString(backupAddr)).toString();
    results[4] = stateString;
    return results;
  }