Java DHCP server IP rausfinden

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.075
Wie kriege ich die IP Adresse eines DHCP servers? eigentlich wollte ich die IP Adresse in meinen Subnetz rausfinden aber es gestaltet sich als schwierig wenn ich über "NetworkInterface" gehe. Da bekomme ich über 20 Interfaces. Eigentlich habe ich nur 3 auf meinen System die Aktiv sind.

Code:
Enumeration<NetworkInterface> netInter = NetworkInterface.getNetworkInterfaces(); 
		int n = 0; 
		 
		while ( netInter.hasMoreElements() ) 
		{ 
		  NetworkInterface ni = netInter.nextElement(); 
		 
		  System.out.println( "NetworkInterface " + n++ + ": " + ni.getDisplayName() ); 
		 
		  for ( InetAddress iaddress : Collections.list(ni.getInetAddresses()) ) 
		  { 
		    System.out.println( "CanonicalHostName: " + 
		                         iaddress.getCanonicalHostName() ); 
		 
		    System.out.println( "IP: " + iaddress.getHostAddress() ); 
		 
		     System.out.println( "Loopback? " + iaddress.isLoopbackAddress() ); 
		     System.out.println( "SiteLocal? " + iaddress.isSiteLocalAddress() ); 
		     System.out.println(); 
		  } 
		}

den code habe ich openbook "geklaut"

diese Lösung ist echt unbrauchbar, da ich mehrere isSiteLocalAddress habe, wegen VM Ware
 
Vielleicht kannst du etwas genauer beschreiben was du machen willst? Eventuell gibt's ja Alternativen, um das Ziel zu erreichen.

Zum Thema:
Wenn dir die Mac-Adresse des DHCP-Servers bekannt ist, dann könntest du über diese die IP-Adresse versuchen zu ermitteln.

Ansonsten existiert auch eine Netzwerk-API für Java mit Sniffing-Funktionalität:
http://sourceforge.net/projects/jpcap/
 
Zuletzt bearbeitet:
ich schreibe ein P2P Programm dass über ein Relay server läuft.... naja P2P halt fü TCP. Es geht um einen Speziellen Fall... sollten die Rechner im selben subnetz sein, dann können die miteinander direkt Kommunizieren falls Hairpintranslation fehlschlägt. dazu brauche ich die ermittlung der interne IP des Rechners die von DHCP vergeben wird. Mit NetworkInterface in java ist es gut getan, aber was tun wenn man mehrere interfaces hat. In der Win Console werden bei mir nur 3 Interface aufgelistet und in der Java Ausgabe nach dem Code da oben habe ich über 20 Interfaces. Es ist die Frage... woher kriege ich meine interne IP adresse?
 
Okay, warum dann die Details des DHCP-Servers ermitteln? Kannst ja auch die eine einfache Subnetz-Masken-Abfrage machen, á la 255.255.255.0.
Ansonsten müsstest du wissen für welches Interface du die IP brauchst. Nicht jedes ist auch mit dem Internet verbunden:
Code:
InetAddress.getByName("74.125.43.103").isReachable(4000);

Die eigene IP-Adresse bekommst du mit
Code:
 InetAddress.getLocalHost().getHostAddress()
Anfragen von außen (also vom WAN) werden vom Router an eine lokale (LAN) weitergeleitet. Wenn du die WAN IP haben wolltest, müsstest du über Umwege gehen. Unter Linux z.B. mit:
Code:
curl http://whatismyip.com/automation/n09230945NL.asp

Der obige Code stammt von hier: http://forum.whatismyip.com/f13/finding-dynamic-ip-using-java-t26/
 
Zuletzt bearbeitet:
mir geht es darum, wie ich die IP von meinen Rechner rausbekomme der unter der Verwaltung eines DHCP routers steht. Interfaces machen da nicht soviel sinn, weil man wirklich wissen muss welcher interface angesprochen ist. wenn ich auf meherer rechnern das programm laufen lasse, kann ich nicht sagen welchen interface diese fürs internet benutzen.
hmm
ps:
ich habe jetzt den ipconfig angesehen... auf meinen inet interface steht ein standartgateway. Wie kann ich in den interface von java den standartgateway anzeigen lassen?
 
Zuletzt bearbeitet:
Du könntest mit netstat abfragen, welches Interface einen Router-Eintrag hat.

Code:
final String netstatCommand = "netstat -rn";
Process netstatCall = Runtime.getRuntime().exec(netstatCommand);
Reader input = new InputStreamReader(netstatCall.getInputStream());

BufferedReader resultOutput = new BufferedReader(input);
String line;
while( (line=resultOutput.readLine()) != null )
   System.out.println(line);

Ergebnis:
Code:
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags   MSS Fenster irtt Iface
192.168.2.0     0.0.0.0         255.255.255.0   U         0 0          0 wlan0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 wlan0
0.0.0.0         192.168.2.1     0.0.0.0         UG        0 0          0 wlan0

In deinem Fall ist u.a. die zweite Spalte von Interesse. Falls es keinen Gateway gibt, lautet der Inhalt der zweiten Spalte 0.0.0.0 oder default. Hinten steht das zugehörige Interface. Das Ganze könnteste also dann einfach ausparsen, z.B. mit einem StringTokenizer.
 
Zuletzt bearbeitet:
das ist aber auf dem WIN recher oder linux?

hab mir auch was überlegt... und daraus kam:

Code:
NetworkInterface ni = netInter.nextElement(); 
if(ni.isUp() && !ni.isLoopback() && !ni.getDisplayName().contains("Virtual"))
es wird aber problematisch sobald man 2 Netzwerkadapter auf dem rechner laufen lässt, die auf den verschiedenen router zugreifen (falls sowas +überhaupt gibt)

die Lösung mit der console ist auch gut!

ps: aah ja ich sehe es... ist Linux tabelle. Ja... problem ist. Ich programmiere in Win, da ich nur virtuelle maschine auf dem rechner habe. Wenn ich auf VM programmiere dann spinnt diese bissen. Extremme Tastenverzögerungen. keine ahnung wieso

hmm schade dass in java keine ifdef's gibt. Kann ja nicht unterscheiden. ob es win oder linux ist

OK, OS kann man auch leicht bestimmten.

Code:
System.out.println(System.getProperty("os.name"));
 
Zuletzt bearbeitet:
Geht auch mit Windows, evtl. ist die Syntax anders:
http://de.wikipedia.org/wiki/Netstat
Aber -rn müsste auch auf Win-Systemen gehen.

Und mit Java kannste auch leicht rauskriegen ob Win oder Unix, einfach mal danach googeln. Ist ein Zweizeiler ;)
 
Zuletzt bearbeitet:
Hmm ich habe mir überlegt... und da kam das Problem wieder. Wie finde ich die eigene IP raus wenn ich 2 Netzwerkkarten im system habe? Daran habe ich am anfang garnicht gedacht!
 
Jede Netzwerkkarte hat ihre eigene IP im angeschlossenen Netz, entweder fest clientseitig eingestellt oder dynamisch über DHCP. Welche willst du haben?
 
angenohmen die beiden netzwerkkarten bekommen die IP über die DHCP. ich will eine verbindung mit einen server mittels UDP aufbauen. Woher weiss ich welche der beiden Karten genutzt wird?
 
Indem du dir deine lokalen Routen ausgeben lässt.
Cmd > route print
Da steht jeweils dabei über welches Interface das jeweilige Zielnetz erreicht wird.
0.0.0.0 ist dabei die Defaultroute an die alle nicht genauer angegebenen Pakete geschickt werden.

Wie man diese Information aus Java abfragt kann ich dir aber leider nicht sagen.

LG Ben
 
Du gehst davon aus, daß dein Rechner nur eine IP hat und willst diese ermitteln. Das ist aber ein nur spezieller Sonderfall, den du nicht als den Normalfall oder gar als allgemeingültig hinstellen kannst. Das hast du ja dank deiner vmware-interfaces selbst bereits festgestellt. Trotzdem hältst du ulkigerweise an deinem Wunsch fest, "deine eine, richtige IP" herauszufinden. Das kann nichts werden. Auf die Frage "Was ist meine IP?" gibt es nicht immer einen eindeutige Antwort. Das muß man akzeptieren und sich damit arrangieren.

roker002 schrieb:
ich schreibe ein P2P Programm dass über ein Relay server läuft.... naja P2P halt fü TCP. Es geht um einen Speziellen Fall... sollten die Rechner im selben subnetz sein, dann können die miteinander direkt Kommunizieren
Aha. Endlich kennen wir deine eigentliche Fragestellung.

Um zu ermitteln, ob ein Zielrechner mit bekannter IP übers lokale Netz direkt erreichbar ist, brauchst du eine Liste _aller_ lokalen, _aktiven_ Interfaces mit jeweils IP-Adresse und Netzmaske. Dann testet du für alle gefundenen Interfaces nacheinander, ob die IP des Zielrechners im gleichen Subnetz liegt, also ob ((InterfaceIP & Netzmaske) == (ZielIP & Netzmaske)). Du verknüpfst also die beiden IPs jeweils per bitweisem "und" mit der Netzmaske und schaust ob die beiden übrigbleibenden Reste identisch sind. Gibts einen Treffer, ist der Zielrechner über eins deiner Interfaces direkt erreichbar. Gibts keinen Treffer, ist der Zielrechner nur über Router erreichbar.

Es ist unnötig und unsinnig den DHCP-Server danach zu fragen, was für eine IP-Adresse er dir geben würde, wenn du jetzt einen neue anfordern würdest. Das ist eine ganz andere Fragestellung als du eigentlich beantwortet haben möchtest. Übrigens gibts ggf. verschiedenen DHCP-Server, wenn du mehrere Interfaces hat.
 
Zuletzt bearbeitet:
@mensch183: Eins vorweg, deutlicher kann man es nicht ausdrücken. Du hast den Kern der Sache getroffen! Nur eine Anmerkung meinerseits, das was da von Dir als spezieller Sonderfall bezeichnet wird, ist im Heimbereich von "Thomas Mustermann" eher die Regel. Ein Computer hängt über eine Netzwerkkarte am heimischen DSL Router. DSL Router und PC bilden ein "Mininetz" mit 2 Komponenten (Router und PC). Thomas Mustermann ist sich nicht bewußt, das er auch noch eine Netzwerkkarte reinstecken oder über VMWare weitere Netzwerkadapter einrichten kann. Ebenso sind ihm VPNs (z.B. beim Einsatz von Cisco-Client Software) nicht geläufig. Das würde ich als Normalfall im Heimbereich ansehen, wo Thomas Mustermann seinen PC typischerweise so nutzt, das er nur E-Mails liest, seine Steuererklärung macht, ein paar Briefe im Word schreibt und ab und zu ein Pornobildchen aus dem Internet lädt.

Wenn ich mir den Thread als solches noch einmal genauer anschaue, erkenne ich da 2 Fragen.
1. Wie erkennt man ob 2 Rechner im selben Subnetz sind? (siehe Antwort von mensch183)
2. Wie erkennt man den Netzwerkadapter der in dem Netz ist in dem sich der DSL Router befindet und somit Zugang zum Internet ermöglicht?

Die 1. Frage ist aus meiner Sicht sehr detailliert erklärt worden. Für die 2. Frage würde ich 3 pragmatische Lösungen bevorzugen. 1. Man macht das Programm konfigurierbar, d.h. der Anwender stellt in einem Optionen Dialog ein, welcher Adapter (sprich welche Netzwerkkarte) mit dem DSL Router verbunden ist, Default könnte gleich der 1. Adapter sein den man findet. Dann wird dieser Adapter verwendet um ins Internet zu kommen. 2. Ich würde während des Programmstarts per Ping auf "www.google.de" die einzelnen Interfaces testen oder 3. prüfen ob über das Interface eine Namensauflösung von "www.google.de" möglich ist (DNS Servereinträge vorhanden und dann Anfrage senden).
Wie dem auch sei, 2. und 3. sind mit mehr Aufwand verbunden den richtigen Adapter zu finden und sollten möglichst nicht in einem kritschen Bereich des Programms (z.B. Codes die sehr oft durchlaufen werden) erfolgen...

Grüße
Rossibaer
 
Rossibaer schrieb:
1. Wie erkennt man ob 2 Rechner im selben Subnetz sind? (siehe Antwort von mensch183)
2. Wie erkennt man den Netzwerkadapter der in dem Netz ist in dem sich der DSL Router befindet und somit Zugang zum Internet ermöglicht?
zu dem punkt 1.
Kliegt alles einfach ist aber nicht so. Da muss ich erst die externe IP adresse vergleichen und dann die interne.
Wenn ich aber 2 Netzwerkkarten habe habe ich aber 2 internetverbindungen die mit den anderen äußeren IPs ausgestattet sind. Naja das ist aber nur ein Extremfall.

mir gehts vorerst darum wie man die interne IP Adresse herausbekommt.

zu dem punkt 2.

ist einfach zu kompliziert. ich suche nur eine einfache lösung und werde mich erstmal mit dem problem befassen wie es aussieht wenn nur eine Netzwerkkarte angeschlossen ist und nur ein rechner in subnetz ist. das mit dem 2 rechner im gleichen subnetz ist eine andere aufgabe!

das ausprobieren meinte ich damit den code schreiben der die daten aus der console auswertet und mir dann die interne mögliche IP liefert. Anhand der ausgewerteten daten werde ich sowieso erkennen ob mein code die richtige IP genommen hat.
 
Zur Funktion des Relay-Servers: Der Relay sieht doch bei allen Clients die Internet-IPs, fragt von diesen die gewünschten Ziel-Ports ab. Dem Rechner der die Verbindung initiieren soll wird die IP des Zielrechners und der Port mitgeteilt. Sieht der Relay, dass beide Rechner über die selbe (Internet-)IP verfügen fragt er beide nach den lokalen IPs und teilt diese mit. Schlägt die direkte Kommunikation fehl, wird per Fallback die Internet-IP benutzt.
Grundsätzliches Problem wäre aber sowieso das korrekte Port-forwarding.
 
Zuletzt bearbeitet:
roker002:
Ich bin da jetzt von deiner Erklärung etwas abgehängt. Jede Netzwerkkarte deines Clients hat eine IP Adresse. Im allgemeinen wäre das eine 192.168. ... Adresse. Wenn du ins Internet gehst, werden die Daten an deinen DSL Router gesendet der wiederum 2 Adressen hat eine fürs interne Netz, sehr wahrscheinlich 192.168.0.1, und eine 2. IP Adresse für das Internet, vom Provider festgelegt, die im Internet sichtbar ist und wohl als externe IP bezeichnet werden kann. Somit funktioniert der DSL Router als Gateway zwischen dem internen Netz und dem Internet. Brauchst du jetzt die "externe" IP Adresse des Routers oder suchst du die interne IP Adresse deines Clients?
 
roker002 schrieb:
das ausprobieren meinte ich damit den code schreiben der die daten aus der console auswertet und mir dann die interne mögliche IP liefert. Anhand der ausgewerteten daten werde ich sowieso erkennen ob mein code die richtige IP genommen hat.
Warum willst du denn den Output irgendwelcher Consolenprogramme verwerten, obwohl du alle nötigen Daten allein mit javainternen Methoden ermitteln kannst? Wie du die per NetworkInterface.getNetworkInterfaces() erhaltene Liste der Netzinterfaces durchgehst, hat du in deinem Eröffnungsartikel bereits mit Code demonstriert.

Im Java-Tutorial findest du auch ein Beispiel, wie du alle lokalen IPs ermittelst:
http://java.sun.com/docs/books/tutorial/networking/nifs/listing.html
Um dein Problem zu lösen, brauchst du lediglich noch zusätzlich zur den IPs noch die Netzmasken der Interfaces. Diese ermittelst du mit http://java.sun.com/javase/6/docs/api/java/net/InterfaceAddress.html#getNetworkPrefixLength()


Das Parsen des Outputs von externen Programmen bringt dir nur völlig unnötig haufenweise zusätzliche Probleme ein. Je nach darunterliegendem Betriebssystem existieren diese externe Programme gar nicht oder liefrn völlig unterschiedliche Ausgaben. Selbst wenn du ein Javaprogramm für windows-only schreiben möchtest, wird das nichts, da sich das Ausgabeformat der Consolenbefehle je nach Sprache des Windows grundsätzlich unterscheidet. Sowas tut man sich nicht freiwillig an.
 
Zurück
Oben