# Java DHCP Anfrage



## pumukel51 (7. Aug 2010)

Hey Community,

Hab mir die Bisherigen Threads zum Thema DHCP schon mal reingezogen da aber leider auch keinen Durchblick bekommen 
Hab grad total den Durchhänger... 
Folgende Problematik macht mir grad extrem zu schaffen.
Muss für meine Technikerausbildung ein JavaProjekt bearbeiten bei welchem ich aktuell Checken möchte ob sich im Netzwerk nen DHCP befindet bzw. obs evtl. mehrere sind und dessen IP halt.
Hab auch echt schon 2 Tage lang Durchgegoogled und mich durch geschätzte 1000xxxx Seiten gelesen komm aber immer noch auf kein Ergebnis.
Weis inzwischen das die Implementation von Netzwerk sachen in Java generell schwierig is.
Muss aber auf Java bleiben wg. Plattformunabhängigkeit usw.
Also nix mit C# oder VB was weis ich...
Hab inzwischen schon ein Java DHCP Projekte im Netz gefunden dhcp4java da sind auch Examples für DHCPClient.java , DHCPSniffer.java und DHCPSnifferServlet.java bekomms aber aktuell überhaupt nicht zum Laufen.
Leider übersteigt das auch iwie meine Java kenntnisse 
Bin im Unterricht bisher leider erst bis zur Vererbung gekommen.
Vielleicht kann mir ja einer von euch Profis mal nen Tipp geben oder das ganze zumindest mal Überfliegen.

Vielen Dank schonmal
Gruß
Pumukel51


----------



## hemeroc (7. Aug 2010)

Hmm also ich hab mal schnell gegoogelt:
JDHCP Project Site das Projekt sieht finde ich recht gut aus, es gibt sogar einen dhcp client als example, das sollte alles können was du brauchst.

Du kannst dich natürlich auch in DHCP einlesen das passende RFC findest du hier: RFC2131 - Dynamic Host Configuration Protocol
Für deine zwecke musst du ja nicht das komplette Protokoll implementieren sondern nur DHCPDISCOVER aber ich rate dir dennoch zu einer bereits funktionsfähigen Bibliothek.

Wieso Netzwerkprogrammierung mit Java schwierig sein sollten ist mir allerdings ein Rätsel, ich finde gerade in Java Netzwerkprogrammierung eigentlich sehr einfach.

Wenn du eine Library findest die deine Java Kenntnisse übersteigt dann hilft wohl nur nachlesen und lernen oder präzise Fragen stellen. Sag uns doch was du nicht verstehst oder wo du Probleme hast bei einem einfachen "das is zu schwer da kenn ich mich nicht aus" wird dir hier niemand helfen.

LG Hemeroc


----------



## pumukel51 (9. Aug 2010)

Hey vielen Dank schon mal.
Hab mir die Page und das Projekt mal angeschaut sieht soweit erstmal ganz gut aus.
Habs nur wohl iwie noch nicht ganz korrekt zum laufen gebracht.
Hab alles nach dem Mini Tutorial gemacht, musste allerdings die Zeile 
	
	
	
	





```
messageOut.setOptions(53, opt.length, opt);
```
abändern da es in der Klasse "DHCPMessage" keine Methode mit dem Namen setOptions gab sondern nur setOption und diese nimmt nicht 3 sondern nur 2 Werte entgegen hab mal den mittleren opt.length rausgeschmissen.
Dann hat Netbeans auch nicht mehr rumgemotzt.
Lies sich dann alles so Ausführen kann allerdings mit dem Ergebniss leider gar nix anfangen.

2 1 6 0 0 0 76 51 0 0 0 0 0 0 0 0 -64 -88 1 12 0 0 0 0 0 0
0 0 0 96 -105 -58 118 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
{54=test.DHCPOptions$DHCPOptionsEntry@de6ced, 53=test.DHCPOptions$DHCPOptionsEntry@c17164, 51=test.DHCPOptions$DHCPOptionsEntry@1fb8ee3, 6=test.DHCPOptions$DHCPOptionsEntry@61de33, 3=test.DHCPOptions$DHCPOptionsEntry@14318bb, 1=test.DHCPOptions$DHCPOptionsEntry@ca0b6}

Das spuckt mein NetBeans in die Console.
Erkenne da allerdings keine IPAdresse oder so was.
Will mich ja nicht selten Dämlich anstellen und mir alles vorkauen lassen aber die gelieferten Klassen übersteigen mein bisheriges Java Verständnis.
Habs mal versucht das iwie nachzuvollziehen aber ...... 
Kann sich evtl. nochmal einer der Problematik annehmen?

Vielen Dank
Gruß


----------



## hemeroc (9. Aug 2010)

Ich hab leider nicht die Zeit mir die komplette Lib genauer anzusehen aber auf der Homepage gibts was besseres als dieses Mini Tutorial nämlich einen kompletten DHCP-Client inklusive README.
Hoffentlich hilft dir das was weiter.
LG Hemeroc


----------



## Gast2 (9. Aug 2010)

Schuss ins Blaue



> 2 1 6 0 0 0 76 51 0 0 0 0 0 0 0 0 *-64 -88 1 12* 0 0 0 0 0 0



DHCP-Server auf 192.168.1.12 ??


----------



## XHelp (9. Aug 2010)

mogel hat gesagt.:


> Schuss ins Blaue
> DHCP-Server auf 192.168.1.12 ??



Ne, da steht die eigene IP. Für eine Sinnvolle DNS Antwort sind da irgendwie paar Nullen zu viel :bahnhof:

@pumukel51, gib mal die bytes mit "&0xFF" aus, dann sieht es für dich evtl. schlüssiger aus.


----------



## pumukel51 (10. Aug 2010)

Geil Geil Geil!!! 
Habs nun schon mal zum laufen gebracht mit dem JDHCP vielen dank an alle Helfer und ganz besonderen Dank an hemeroc für seine verdammt schnellen antworten und guten Tipps!!
Kann es allerdings sein das der Code nicht zu 100% Plattformunabhängig ist???
Unter Windows hat es eigentlich fast immer Funktioniert unter Linux bekomme ich allerdings immer den Socket Error.
Gibt es evtl. mit Linux weitere Möglichkeiten zumindest mal zu prüfen ob die Netzwerkkarte Ihre IP von nem DHCP erhalten hat sollte ja vielleicht irgendwo ne Leastime oder sowas zu finden sein.
Desweiteren hab ich nirgends nen richtigen Timeout gefunden wenn kein DHCP Antwortet hab das tool mal 2 min mit gezogenem Netzwerkkabel laufen lassen das läuft ja ins Unendliche.
Kann ich das evtl. wenn ichs als Thread starte einfach nach 25sec killen?
Und halt die Ausgabe dann selbst erstellen das es nicht geklappt hat?
Oder hat sonst wer ne einfachere Idee???

Gruß Pumukel51


----------



## hemeroc (10. Aug 2010)

Hmm ich verwende selber auch Ubuntu (Linux) und da musst du hald drauf achten es als su (am besten mittels sudo) zu starten da ein "normaler" Benutzer nicht die Berechtigung hat auf dem  DHCP-Port zu binden.
Sollte es dann immernoch nicht gehen poste einfach mal den Error (Stacktrace) den du bekommst.
LG Hemeroc

//Edit: ich sollte weiterlesen dann würd ich gleich alle Teile der Frage beantworten. =)
Damit du einen Thread nach einer bestimmten Zeit stoppen kannst würde ich einfach einen zweiten Thread starten der einfach die gewünschte Timeout-Zeit schläft und nach dieser den ersten Thread "killt" indem er ihn interrupted, den Socket schließt, ein Flag setzt, usw. je nach dem was gerade sinnvoll ist. Genaueres zum beenden von Threads findest du hier: [JavaSpecialists 056] - Shutting down threads cleanly


----------



## Gast2 (10. Aug 2010)

pumukel51 hat gesagt.:


> Kann es allerdings sein das der Code nicht zu 100% Plattformunabhängig ist???


doch ist er



> Unter Windows hat es eigentlich fast immer Funktioniert unter Linux bekomme ich allerdings immer den Socket Error.


weil Dir die Rechte fehlen ... unter Linux darfst Du nur als Root Ports < 1024 öffnen



			
				DHCP-RFC hat gesagt.:
			
		

> DHCP uses UDP as its transport protocol.  DHCP messages from a client to a server are sent to the 'DHCP server' port (67), and DHCP messages from a server to a client are sent to the 'DHCP client' port (68).



hand, mogel


----------



## pumukel51 (10. Aug 2010)

So mir kurz ne Jar Datei kompiliert und die in ne Virtuelle Maschiene mit Ubuntu 10.04 gepackt dann mit su - zum root gemacht und ausgeführt hatt aber den selben Fehler hab euch die Jar Datei mal angehängt könnts ja evtl. mal testen.



> root@ubuntu:~# java -jar "/home/xxx/Desktop/JavaDHCP/dist/JavaDHCP.jar"
> ********************************************************
> * Starting dhcpclient sample application written using *
> * JDHCP v1.1.1. Learn more about the JDHCP project at  *
> ...



Anbei noch die Netzwerk konfig von der VM,


> root@ubuntu:~# ifconfig
> eth0      Link encap:Ethernet  Hardware Adresse 00:0c:29:42:3e:08
> inet Adresse:192.168.1.16  Bcast:192.168.1.255  Maske:255.255.255.0
> inet6-Adresse: fe80::20c:29ff:fe42:3e08/64 Gültigkeitsbereich:Verbindung
> ...


----------



## XHelp (10. Aug 2010)

Vllt versuchst du einen ServerSocket zu erstellen auf einen Port, der bereits benutzt wird?


----------



## hemeroc (10. Aug 2010)

Ja sieht für mich jetzt auf den ersten Blick auch so aus. Hast du vielleicht dein Ubuntu noch auf DHCP gestellt denn den in Ubuntu integrierten DHCP-Client musst du natürlich abschalten =)

Dazu einfach mit Rechtsklick auf den "network indicator", dann Verbindungen bearbeiten und das gewünschte Netzwerk wählen, jetzt unter IPV4 auf Manuell stellen dann sollte es gehn.

LG Hemeroc


----------



## pumukel51 (12. Aug 2010)

Hm okay Danke schon mal mit Deinem Tipp hats auch unter Linux Funktioniert.
Allerdings is das irgendwie nicht ganz befriedigend ich meine Irgendwann möchte ich mein Programm verschiedenen Leuten Zurverfügungstellen und da kann ich nicht verlangen das da jemand erst alles mögliche im System umkonfiguriert des weiteren musste ich nun feststellen das es unter Windows auch nicht ganz soooo zuverlässig funktioniert bekomme häufig auch mit Administratorrechten den "Socket Bind Error:" dann kann ichs 2 min Später wieder probieren dann gehts auf einmal... ???:L???:L???:L
Oder ich implementiere das so in mein Programm das es zumindest noch eine weitere Methode gibt um zumindest ansatzweise eine aussage treffen zu können ob es einen DHCP im Netz gibt da sollte man doch über NetworkInterfaces herausfinden können ob´s ne Fixe IP oder eine vom DHCP vergebene IP ist bzw. ob´s ne Leastime gibt was ja auch auf einen DHCP schließen lässt.
Ich werde da auch mal Googlen nur wenn evtl. schon jemand ne andere oder Bessere Idee hat könntet Ihr´s ja mal Posten.

Vielen Dank schonmal
Grüße Pumukel51


----------



## pumukel51 (10. Jan 2011)

Sorry das ich das Thema schon wieder hochhole aber das Problem schlaucht mich aktuell enorm!

Hab in meinem Projekt aktuell das hier besprochene JDHCP implementiert allerdings bekomme ich damit mehr und mehr Probleme.
Leider funktioniert es unter Linux immer noch nur sehr unzuverlässig und ich habe es bisher nicht besser hinbekommen.
Des weiteren habe ich es mal in verschiedenen Netzwerken ausprobiert in welchen definitiv DHCP Server stehen und auch häufig gar keine IP Adresse erhalten.
Habe auch mal im Netz nach alternativen gesucht bin bisher allerdings ausschließlich über Lösungen gestoßen welche nur in Verbindung mit einer zusätzlichen externe Software funktionieren was ja eine eher unschöne Lösung darstellt.
Hat denn noch jemand von euch ne Idee wie man das via Java zuverlässig ermitteln könnte?

Vielen Dank für Eure bemühungen!

Gruß Pumukel51


----------



## Andi_CH (10. Jan 2011)

Schick doch bitte den Code den du schon hast.


----------



## pumukel51 (11. Jan 2011)

Ich verwende nur die vom JDHCP Projekt zur Verfügung gestellten Klassen und habe die Klasse welche die anfrage sendet nur ganz leicht auf meine Bedürfnisse angepasst also z.b. die Abfrage nur bis zur IP Adresse durchlaufen zu lassen und nicht den Ablauf der Lease Time abzuwarten was ich ja für meine Zwecke garnicht benötige.
Desweiteren habe ich im Quellcode schon eine MAC Adresse angegeben da es für meine Bedürfnisse nicht von Nöten ist da eine vom USER eingeben zu lassen.

Wie gesagt möchte ich nur herrausfinden ob es im Netzwerk nen DHCP Server gibt.
Allerdings bekomme ich das mit dem JDHCP Tool bisher nicht sauber hin.
Zum einen Blockiert mir Ubuntu die Ports auch wenn ich mit Root rechten starte und es ist ja keine wirklich saubere Lösung den User zu bitten sich eine Fixe IP zu vergeben um die Ports ansprechen zu können.
Außerdem habe ich festgestellt das dieser DHCP Scanner nicht bei jedem eingesetzten Router mit aktivierter DHCP Funktion auch läuft und auch in unserm Schulnetzwerk wo es definitiv einen DHCP gibt läuft das Programm ins Nirvana und bekommt wohl nie eine Antwort.
Deshalb wollte ich mal fragen ob euch Profis hier noch eine alternative Methode bekannt ist unter JAVA den DHCP Server zu ermitteln.
Hab ja auch mal gegoogelt aber leider nur Lösungen mit externer Software gefunden was ja auch nicht wirklich schön ist wüsste jetzt auch auf Anhieb nicht wie ich das dann automatisiert in mein Programm einbinden könnte...


----------



## Empire Phoenix (12. Jan 2011)

Dirty aber simple unter windows inner cmd ipconfig /all per processbuilder aufrufen und dann nach dem String 
"Lease erhalten" bzw "Lease läuft ab" suchen. Denke unter linux gibt es da ähnliche programm und unter mac ebenfalls.

Ist zwar alles andere als Plattformunabhängig aber evtl einfacher zu realisieren als anders, und bracht ausser adminrechte beim ausführen keine weitere konfiguration an dem system selber
Sind ja nur 3 relevante großen Betreibsystem vorhanden, wobei mac brach man ja auch net umbedingt, also 2 und ipconfig gibts zumindest ab xp in jeder windowsversion.


----------



## Andi_CH (12. Jan 2011)

Ich hätte ja gerne damit experimentiert - in meinem Netzwerk hat es einen DHCP und ich hab Linux und Windows - aber ohne deinen Code mache ich sicher nichts.

Legst du keinen Wert auf eine pratkische Lösung?
Ich geh jetzt sicher nicht hin, finde erst mal raus wie sich ein DHCP-Server meldet und und und :noe:


----------



## pumukel51 (12. Jan 2011)

Ja okay okay hast ja recht!
Hab Dir mal mein Netbeansprojekt umprogrammiert das es als kleine Konsolenanwendung funktioniert.
Und als Netbeansprojekt gezippt und angehängt.

Alternativ hier noch der von mir genutzte und angepasste Code.
[Java]package javadhcp;

// Example dhcp client simulation written using JDHCP API.
// Jason Goldschmidt, Nick Stone 10/08/1998
// last updated 9/06/1999


import java.net.*;
import java.io.*;
import java.util.Random;
import java.util.StringTokenizer; 
import edu.bucknell.net.JDHCP.*;

//----------------------------------------------------------------
// dhcpclient simulation program
//----------------------------------------------------------------

public class dhcpclient{
    private static String Ergebnis="";

    public static void main() {

        /*********************************************************
         * Starting dhcpclient sample application written using *
         * JDHCP v1.1.1. Learn more about the JDHCP project at  *
         * http://www.eg.bucknell.edu/~jgoldsch/dhcp/           *
         * JDHCP is an API for writting Java(tm) applications   *
         * that speak the Dynamic Host Configuration Protocol   *
         * Note: dhcpclient is merely a simulation of what a    *
         * DHCP client does within its lifecycle as specified   *
         * in RFC 2131 and 2132. This application and JDHCP was *
         * co-authored by Jason Goldschmidt and Nick Stone.     *
         *********************************************************/

	String hwaddr = new String();
        hwaddr="00:50:8B:74:5F:6F";
	       /*if (args.length > 0) {
        hwaddr = args[0];
        } else {
        System.out.println("Usage: dhcpclient <ethernet_addresss>\n\t" +
        " ie. dhcpclient 12:34:56:76:0f:08");
        System.exit(1);
        }*/

	try {
            DHCPSocket mySocket = 
		new DHCPSocket(DHCPMessage.CLIENT_PORT); // create socket
	    // Use port 67 if you are configuring as a bootp relay agent
	    //	    DHCPSocket mySocket = new DHCPSocket(67); 

	    // Put the hardware address of the computer you are using here. 

            Client x = new Client(mySocket, hwaddr);

	    x.start();  // start the client. Sit back and enjoy the simulation fun
            Thread.sleep(5000);
            x.stop();
        } catch (java.net.BindException e1) {
		System.err.println("Socket Bind Error: ");
		System.err.print("Another process is bound to this port\n");
		System.err.print("or you do not have access to bind a process ");
		System.err.println("to this port");
	} catch (Exception e2) {
	    System.out.println("dhcpclient:main: " + e2);
	}
    }
    public static void getErgebnis (String Erg){
    dhcpclient.Ergebnis=Erg;
    }
}


//----------------------------------------------------------------
// Client class
//----------------------------------------------------------------


class Client extends Thread {

    DHCPSocket bindSocket = null;
    byte hwaddr[] = new byte[16];
    InetAddress serverIP;
    int portNum;  
    boolean gSentinel;
    // DHCP option constants
    static final int REQUESTED_IP = 50;
    static final int LEASE_TIME = 51;
    static final int MESSAGE_TYPE = 53;
    static final int T1_TIME = 58;
    static final int T2_TIME = 59;
    private String Ergebnis="";

    //----------------------------------------------------------------
    // Constructor for Client class
    //----------------------------------------------------------------

    public Client(DHCPSocket inSocket, String inHwaddr) {
	bindSocket = inSocket;
	hwaddr = ChaddrToByte(inHwaddr); 
	this.setName(inHwaddr);   // set thread name 
	// note: a DHCPMessage can take no parameters and these values here
	// would still be the default. 
	serverIP = DHCPMessage.BROADCAST_ADDR;  // localnet broadcast
	portNum = DHCPMessage.SERVER_PORT; // default DHCP server port
	gSentinel = true;
    }

    //----------------------------------------------------------------
    // Thread main
    //----------------------------------------------------------------


    @Override
    public void run () {
	try {
	    DHCPMessage offerMessageIn = new DHCPMessage(serverIP, portNum);
	    offerMessageIn = SendDiscover();
	    DHCPMessage messageIn = offerMessageIn;
	    byte [] messageType = new byte[1];

	    while (gSentinel) {
		messageType = messageIn.getOption(MESSAGE_TYPE);
		switch (messageType[0]) {
		case DHCPMessage.OFFER:
		    System.out.print(this.getName());
		    System.out.print(" received a DHCPOFFER for ");
		    System.out.println(bytesToString(messageIn.getYiaddr()));
                    this.Ergebnis=this.Ergebnis+this.getName()+" received a DHCPOFFER for "
                            +bytesToString(messageIn.getYiaddr())+" \r\n";

                   //messageIn.printMessage();
		    messageIn = SendRequest(messageIn);
		    break;
                case DHCPMessage.ACK:
		    byte[] t1 = new byte [4];
		    byte[] t2 = new byte [4];
		    t1 = messageIn.getOption(T1_TIME);
		    t2 = messageIn.getOption(T2_TIME);
		    System.out.print(this.getName());
		    System.out.print
			(" received an DHCPACK and a leasetime.");
                    this.Ergebnis=this.Ergebnis+this.getName()+" received an DHCPACK. \r\n";
		    System.out.println("\nBinding to IP address: "+bytesToString(messageIn.getYiaddr()));
                    this.Ergebnis=this.Ergebnis+"Binding to IP address: "+bytesToString(messageIn.getYiaddr())+" \r\n";
                    dhcpclient.getErgebnis(Ergebnis);
                    gSentinel=false;
		    /*System.out.print(bytesToString(messageIn.getYiaddr()));
                    System.out.print("\nGoodnight for ");
                    //messageIn.printMessage();
                    System.out.print(1000 * byteToLong(t1));
                    System.out.println(" seconds");
                    this.sleep(1000 * byteToLong(t1));
                    System.out.print(this.getName());
                    System.out.println(" sending ReNew Message to server...");
                    messageIn = ReNew(messageIn);*/
		    break;
		case DHCPMessage.NAK:
		    System.out.println(this.getName());
		    System.out.print("Revieded DHCPNAK... ");
		    messageIn = SendDiscover();
		    break;
		default:
		    break;
                    }


	    }
	} catch (Exception e) {
	    System.err.println(e);
	}
      }

    // -------------------------------------------------------------------
    // dhcpclient message send/recieve functions
    // -------------------------------------------------------------------

    // Sends DHCP Discover Message and returns the recieved Offer Message

    private DHCPMessage SendDiscover () {
	Random ranXid = new Random();
	DHCPMessage messageIn = new DHCPMessage(serverIP, portNum);
	DHCPMessage messageOut = new DHCPMessage(serverIP, portNum);
	try {
	  // fill DHCPMessage object 
	    messageOut.setOp((byte) 1);    //setOp Method being used
	    messageOut.setHtype((byte) 1);
	    messageOut.setHlen((byte) 6);
	    messageOut.setHops((byte) 0);
	    messageOut.setXid(ranXid.nextInt()); // should be a random int
	    messageOut.setSecs((short) 0);
	    messageOut.setFlags((short) 0);
	    messageOut.setChaddr(hwaddr); // set globaly defined hwaddr

	    // Uncomment below to set host up as a bootp relay agent. Do this
	    // if you are trying to send messages containing hardware adresses
	    // other than your own. 
	    //InetAddress ia = InetAddress.getLocalHost();
            //byte[] ip = ia.getAddress();
            //messageOut.setGiaddr(ip);

	    byte[] opt = new byte[1];
	    opt[0] = (byte) DHCPMessage.DISCOVER;

	    messageOut.setOption(MESSAGE_TYPE, opt);

	    bindSocket.send(messageOut); // send DHCPDISCOVER

	    System.out.println("Sending DHCPDISCOVER....");
            this.Ergebnis="Sending DHCPDISCOVER with MAC Address: "+this.hwaddr+" \r\n";

	    boolean sentinal = true;
	    while (sentinal) {
		if (bindSocket.receive(messageIn)) {
		    if (messageOut.getXid() == messageIn.getXid())
		       sentinal = false;
		    else 
			bindSocket.send(messageOut); 
		}
		else 
		    bindSocket.send(messageOut); 
	    }
	} catch (SocketException e) {
            System.err.println(e);
        } catch (IOException e) {
            System.err.println("dhcpclient::SendDiscover:" + e);
        }  // end catch
	return messageIn;

    }

    // Sends DHCPREQUEST Message and returns server message

    private DHCPMessage SendRequest (DHCPMessage offerMessageIn) {
	DHCPMessage messageOut = new DHCPMessage(serverIP, portNum);
	DHCPMessage messageIn = new DHCPMessage(serverIP, portNum);
	try {
	    messageOut = offerMessageIn;
	    messageOut.setOp((byte) 1);  // setup message to send a DCHPREQUEST
	    byte [] opt = new byte[1];
	    opt[0] = (byte) DHCPMessage.REQUEST;
	    messageOut.setOption(MESSAGE_TYPE, opt); // change message type
	    messageOut.setOption(REQUESTED_IP, offerMessageIn.getYiaddr());	
	    bindSocket.send(messageOut); // send DHCPREQUEST
	    System.out.print(this.getName());
	    System.out.print(" sending DHCPREQUEST for ");
	    System.out.
		println(bytesToString(offerMessageIn.getOption(REQUESTED_IP)));
            this.Ergebnis=this.Ergebnis+this.getName()+" sending DHCPREQUEST for "
                    +bytesToString(offerMessageIn.getOption(REQUESTED_IP))+" \r\n";
	    boolean sentinal = true;
	    while (sentinal) {
		if (bindSocket.receive(messageIn)) {
		    if (messageOut.getXid() == messageIn.getXid()) {
			sentinal = false;
		    } else {
			bindSocket.send(messageOut); 
		    }
		} else {
		    bindSocket.send(messageOut); 
		}
	    }
	} catch (SocketException e) {
	    System.err.println(e);
	} catch (IOException e) {
	    System.err.println(e);
	}  // end catch
	return messageIn;
    }

    // Sends DHCPRENEW message and returns server message

    private DHCPMessage ReNew (DHCPMessage offerMessageIn) {
	String server_IP = bytesToString(offerMessageIn.getSiaddr());
	DHCPMessage messageOut = null;
	try {
	    messageOut = 
		new DHCPMessage(InetAddress.getByName(server_IP), 
				portNum); // unicast

	} catch (UnknownHostException ex) {
	    System.err.println(ex);
	}
	DHCPMessage messageIn = new DHCPMessage(serverIP, portNum);
	try {
	    messageOut = offerMessageIn;
	    messageOut.setOp((byte) 1);  // setup message to send a DCHPREQUEST
	    byte [] opt = new byte[1];
	    opt[0] = (byte) DHCPMessage.REQUEST;
	    messageOut.setOption(MESSAGE_TYPE, opt); // change message type
	    // must set ciaddr
	    messageOut.setCiaddr(offerMessageIn.getYiaddr()); 

            int so_timeout = bindSocket.getSoTimeout()/1000;
            long t1 = byteToLong(offerMessageIn.getOption(T1_TIME));
            long t2 = byteToLong(offerMessageIn.getOption(T2_TIME));

            int elpstime = 1;

            bindSocket.send(messageOut); // send DHCPREQUEST
	    boolean sentinal = true;
	    while (sentinal) {
		if (((elpstime * so_timeout) + t1)  >=  t2) {
		    System.out.print(this.getName());
		    System.out.println(" rebinding, T1 has ran out...");
		    messageIn = ReBind(offerMessageIn);
		    break;
		}
		if (bindSocket.receive(messageIn)) {
		    sentinal = false;
		    break;
		} else {
		    bindSocket.send(messageOut); 
		    elpstime++;
		}
	    }
	} catch (SocketException e) {
	    System.err.println(e);
	} catch (IOException e) {
	    System.err.println(e);
	}  // end catch
	return messageIn;
    }

    // Sends DHCPREBIND message, returns server message

    private DHCPMessage ReBind (DHCPMessage offerMessageIn) {
        DHCPMessage messageOut = new DHCPMessage(serverIP, portNum); //broadcast
        DHCPMessage messageIn = new DHCPMessage(serverIP, portNum);
        try {
	    messageOut = offerMessageIn;

            messageOut.setOp((byte) 1);  // setup message to send a DCHPREQUEST
            byte [] opt = new byte[1];
            opt[0] = (byte) DHCPMessage.REQUEST;
            messageOut.setOption(MESSAGE_TYPE, opt); // change message type

	    messageOut.setCiaddr(offerMessageIn.getYiaddr());
            // must set ciaddr
	    long leaseTime = byteToLong(offerMessageIn.getOption(LEASE_TIME));
	    long t2 = byteToLong(offerMessageIn.getOption(T2_TIME));
            int so_timeout = bindSocket.getSoTimeout()/1000;
	    int elpstime = 1;

            bindSocket.send(messageOut); // send DHCPREQUEST
	    boolean sentinal = true;
	    while (sentinal) {
		if (((elpstime * so_timeout) + t2)  >=  leaseTime) {
		    System.out.print(this.getName());
		    System.out.print(" is sending DHCPRELEASE, T2 has ran out ");
		    System.out.println("shuttingdown.");
		    SendRelease(offerMessageIn);
		    break;
		}
		if (bindSocket.receive(messageIn)) {
		    if (messageOut.getXid() == messageIn.getXid())
		       sentinal = false;
		    else {
			bindSocket.send(messageOut); 
			elpstime++;
		    }
		} else {
		    bindSocket.send(messageOut); 
		    elpstime++;
		}
	    }

	} catch (Exception e) {
	    System.err.println(e);
	}

        return messageIn;
    }

    // Sends DHCPRELEASE message, returns nothing

    private void  SendRelease (DHCPMessage inOfferMessage) {
	DHCPMessage messageOut = new DHCPMessage(serverIP, portNum);
	try {
	    messageOut = inOfferMessage;
	    messageOut.setOp((byte) 1);  // setup message to send a DCHPREQUEST
            byte [] opt = new byte[1];
            opt[0] = (byte) DHCPMessage.RELEASE;
            messageOut.setOption(MESSAGE_TYPE, opt); // change message type

	    bindSocket.send(messageOut); // send DHCPREQUEST    
	    gSentinel = false;
	} catch (Exception e) {
	    System.err.println(e);
	}
    }

    // ------------------------------------------------------------------
    // start dhcpclient Util functions
    // ------------------------------------------------------------------

    // Converts byte[4] => long

    long byteToLong (byte inB[]) {
	long ttime = (((char) inB[0] * (256*256*256)) + 
                      ((char) inB[1]*(256*256)) + 
                      ((char) inB[2]*(256)) + 
                      (char) inB[3]);
        return ttime;
    }

    // Converts byte[4] => Strings

    String bytesToString(byte inB[]) {
	String st = new String();
        for (int n = 0; n < 4; n++) {
            st += (int)((char) inB[n]%256);
            if (n < 3) {
                st += ".";
            }
        }
        return st;
    }

    // Converts the Chaddr String => byte[15]

    private byte[] ChaddrToByte(String inChaddr) {
	StringTokenizer token = new StringTokenizer(inChaddr, ":");
	Integer tempInt = new Integer(0);
	byte outHwaddr [] = new byte[16];
	int temp;
	int i = 0;                                                     
	while (i < 6) {
	    temp = tempInt.parseInt(token.nextToken(), 16); 
	    outHwaddr_ = (byte) temp;
	    i++;
	}
	return outHwaddr;
    }

}

[/code]

Dazu benötigst Du halt noch die 3 Klassen von der JDHCP seite sind in meine Angehängten ZIP oder kannsts Dir in ner Zip von deren Page laden Link anbei.

Benötigte Klassen


Vielen Dank für Deine bemühungen!
Gruß Pumukel51_


----------

