/** * Receives a datagram packet containing a DHCP Message into a DHCPMessage object. * * @return true if message is received, false if timeout occurs. * @param outMessage DHCPMessage object to receive new message into */ public synchronized boolean receive(DHCPMessage outMessage) { try { DatagramPacket incoming = new DatagramPacket(new byte[packetSize], packetSize); // gSocket. receive(incoming); // block on receive for SO_TIMEOUT outMessage.internalize(incoming.getData()); } catch (java.io.IOException e) { return false; } // end catch return true; }
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; }