Java DHCP Anfrage

pumukel51

Mitglied
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

Bekanntes Mitglied
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

Mitglied
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
Java:
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

Bekanntes Mitglied
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
 

pumukel51

Mitglied
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

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:
G

Gast2

Gast
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

Mitglied
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 *
* 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. *
********************************************************
Socket Bind Error:
Another process is bound to this port
or you do not have access to bind a process to this port
root@ubuntu:~#

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
UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1
RX packets:5602 errors:0 dropped:0 overruns:0 frame:0
TX packets:4257 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:1000
RX bytes:3959902 (3.9 MB) TX bytes:711227 (711.2 KB)
Interrupt:19 Basisadresse:0x2000

lo Link encap:Lokale Schleife
inet Adresse:127.0.0.1 Maske:255.0.0.0
inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine
UP LOOPBACK RUNNING MTU:16436 Metrik:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:0
RX bytes:720 (720.0 B) TX bytes:720 (720.0 B)

root@ubuntu:~#
 

hemeroc

Bekanntes Mitglied
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

Mitglied
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

Mitglied
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
 

pumukel51

Mitglied
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

Top Contributor
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.
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
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

Mitglied
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
 

Anhänge

  • JDHCP.zip
    74,2 KB · Aufrufe: 11
Ähnliche Java Themen
  Titel Forum Antworten Datum
D HTTP Apache-HttpClient/UNAVAILABLE (java 1.4) Netzwerkprogrammierung 18
M JAX-WS unter Java 17 plötzlich nicht mehr möglich Netzwerkprogrammierung 5
K Java RMI bricht ab wenn Remote eine Methode ausgeführt werden soll Netzwerkprogrammierung 5
M HTTP Let's Encrypt und Java Trust-Store Netzwerkprogrammierung 6
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
D path-Variablen in eine URL hinzufügen mit Java 1.8 Netzwerkprogrammierung 2
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
x46 Java SSLContext erstellen mit SSL-Zertifikat Netzwerkprogrammierung 1
P Jenkins Login per Java Download Manager Netzwerkprogrammierung 15
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
V Browsergame mit Java(WebSocketServer) als Backend? Netzwerkprogrammierung 5
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Fragen zu Java Webservice mit Axis2 Netzwerkprogrammierung 0
M Mit Java Mail Mails an Webmailer schicken Netzwerkprogrammierung 1
mor16Euro HTTP Php website mit Java aktualisiern Netzwerkprogrammierung 6
T HTTP JAVA Browser Konsolenanfrage(JavaScript) Netzwerkprogrammierung 7
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
M Socket peer to peer Verbindung zwischen Java und Matlab Netzwerkprogrammierung 0
L Remote Desktop per Java steuern Netzwerkprogrammierung 4
F Server für Java Applikationen Netzwerkprogrammierung 16
J Webserver mit Java schreiben? Netzwerkprogrammierung 4
D JAVA RMI Netzwerkprogrammierung 1
K HTTP Mit Java HTML Codeauslesen um damit zu arbeiten Netzwerkprogrammierung 7
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
A Bestimmter URL/Certificate per Java immer vertrauen (Trustmanager/HostnameVerifier) Netzwerkprogrammierung 1
T VPN-Verbindung über Java Netzwerkprogrammierung 4
M HTTP PATCH Request mit Java ausführen Netzwerkprogrammierung 2
Niggo_ Probleme mit Java Mail Netzwerkprogrammierung 14
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
L FTP Java Interpreter unterbindet SSL Handshake Netzwerkprogrammierung 2
C IFrame mit java auslesen Netzwerkprogrammierung 1
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
C Datensammlung mit Java RMI Netzwerkprogrammierung 0
K Java Jsoup : OnLoad Netzwerkprogrammierung 0
S Java Chat Server Netzwerkprogrammierung 8
Carres HTTP Vorhandenen Session-ID Cookie von Firefox, Chrome oder IE in Java verwenden Netzwerkprogrammierung 2
B Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen Netzwerkprogrammierung 1
Z HTTP HTML Element auslesen in Java Netzwerkprogrammierung 1
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
P Chat in Java Netzwerkprogrammierung 3
C java.net.ConnectException: Operation timed out? Netzwerkprogrammierung 2
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
T curl request in java umwandeln Netzwerkprogrammierung 4
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
L Java RMI Objekt konsistenz Netzwerkprogrammierung 1
H Portforwarding umgehen in Java? Netzwerkprogrammierung 5
D Response in Java Servlet erzeugen Netzwerkprogrammierung 0
X Mit Java eine Applikation auf einem anderen Windows Rechner (Windows Server 2008) starten Netzwerkprogrammierung 1
E HttpUrlConnectionExample cannot be resolved to a type / Java 8 Netzwerkprogrammierung 1
F Socket Java Server mit Android App, Antwort vom Server an App Netzwerkprogrammierung 5
M Java-Programm aus dem Web laden Netzwerkprogrammierung 3
S HTTP-Requeste von Browser mit Java sniffen? Netzwerkprogrammierung 9
J access denied (“java.net.SocketPermission”…) mit Java 8 Netzwerkprogrammierung 1
N CURL requests in Java Netzwerkprogrammierung 6
P Kritische Java-Anwendung und Citrix veröffentlichen Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
1 Netty NIO oder Java IO Netzwerkprogrammierung 2
1 Via Java mit WLAN Netzwerken verbinden Netzwerkprogrammierung 5
J Java Service Wrapper Netzwerkprogrammierung 1
K Mit Java ASPX Webseite fern steuern Netzwerkprogrammierung 2
H Socket Java | Server sendet Nachricht nur wenn vorher eine JOptionPane-Nachricht ausgegeben wurde. Netzwerkprogrammierung 2
K Emailsenden via Java Applikation Netzwerkprogrammierung 5
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
C Java Chat Admin Kenzeichnung Netzwerkprogrammierung 14
P PHP Script per Java ausführen Netzwerkprogrammierung 2
P PPTP Protokoll für JAVA Netzwerkprogrammierung 14
T php/java-bridge Netzwerkprogrammierung 16
D Webseite(mit JavaScript-Element) mit Java auslesen Netzwerkprogrammierung 0
G Multiple Clients and one Server --> java.lang.NullPointerException Netzwerkprogrammierung 1
E Java Server übers Internet erreichen Netzwerkprogrammierung 4
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
windl AirPlay mittels Java Netzwerkprogrammierung 0
R Email mit Java API Netzwerkprogrammierung 1
P Java Deauth / Deauthentication request Netzwerkprogrammierung 10
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
E HTTP java.lang.IllegalArgumentException: protocol = http host = null Netzwerkprogrammierung 1
R Java - Socketprogrammierung Netzwerkprogrammierung 10
B Methoden und Konstruktoren von Java.net package werden nicht geladen Netzwerkprogrammierung 2
L Email versenden mit Java funktioniert nicht, Fehlermeldungen: MessagingException & SocketException Netzwerkprogrammierung 10
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
N Socket java.net.ConnectException Netzwerkprogrammierung 5
A Java Server - IOS Client Applikation Netzwerkprogrammierung 20
V json_encode in java?? Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben