Wie komme ich an meine eigene IP-Adresse ran?

möglichst ohne schlimme hacks…

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Wie komme ich an meine eigene IP-Adresse ran?
Hi,

Gibt es eine saubere Möglichkeit an die IP-Adresses des Rechners zu kommen, auf dem mein Programm gerade läuft (OS: Linux, das ganze mit c++ programmiert)? Ich habe natürlich schon gethostbyname() etc. ausprobiert, aber wenn ich da localhost eingebe, kriege ich natürlich 127.0.0.1 raus… wenn ich diese Adresse an einen anderen Rechner verschicke kann ich auf dem anderen Rechner damit nix anfangen. (ja, ich weiss, da könnte ich mir auch einfach im Empfänger der Nachricht die Absenderadresse anschauen. Aber ich könnte potentiell auch eine Adresse eines anderen Rechners an den Empfänger schicken, d.h. in diesem Fall wäre Absenderadress!= mit der Nachricht verschickte Adresse)
Im Internet gibt es einige Vorschläge dazu, aber das geht meistens indem man eine Verbindung zu localhost aufbaut, und dann sieht man an der Absenderadresse ja die IP-Adresse. Das würde ich aber nicht als besonder elegant oder portabel bezeichnen.


Also du musst natürlich auswählen, von welchem Interface du die Adresse haben willst. Ich hab sowas mal für Win32 (C++ MFC) geschrieben, da hab ich u.a. die Funktion GetIpAddrTable() verwendet. Weiß net, wie das Linux-Äquivalent ist, vllt steht ja in der MSDN ein Verweis drauf drin. Aber vllt hilft dir auch die Kenntnis weiter, dass du irgendwie ne Liste von Netzwerkinterfaces brauchst, von denen du dann auch die Adresse mitbekommst. listen() kannst du natürlich auf allen Interfaces machen, und connect() sucht sich sowieso das passende raus iirc, aber für eine konkrete Adresse braucht’s halt auch ein konkretes Interface.

PS: Du wirst in dieser Liste natürlich auch das loopback-Interface erhalten, dessen Adresse dann 127.0.0.1 ist. Ob du das anzeigen willst, ist dann deine Sache. :wink:


In der MSDN steht sicher nicht, wie es unter *NIX geht und der genannte Befehl ist auch ein W32-API-Aufruf. Wenn du mit localhost verbindest sollte die Absenderadresse übrigens auch 127.0.0.1 sein, da die Verbindung auf localhost (127.0.0.1) logischerweise über das Interface lo geht.

Die eigene IP zu übertragen halte ich im generellen für eine schlechte Idee, da dies dann z.B. Router, Proxys etc. auf dem Weg zuwiederläuft, man denke auch an WLAN und schlussendlich reicht die IP auch nicht zur Identifizierung (mehrere Verbindungen von einer IP, mehrere Rechner mit gleicher IP im eigenen VLAN).

Ansonsten kann ich dir aus dem Stehgreif jetzt leider auch nicht weiterhelfen.


Je länger ich darüber nachdenke, desto mehr bin ich auch dieser Meinung. Ich werd mir eine andere Lösung einfallen lassen. Danke für eure Hilfe!


Grundsätzlich schlechte Idee, denke ich auch.
Aber wenn du jemand anderem deine IP-Adresse schicken willst musst du normalerweise dafür eine Verbindung aufbauen (TCP) oder ein UPD-Paket verschicken.
In beiden Fällen sollte sich doch die IP auf der Empfängerseite ermitteln lassen?


Folgendes Szenario:
Rechner A will Rechner B eine Nachricht schicken. Die Nachricht enthält Informationen wo B weitere Informationen bekommen kann (hier: zu welchem Rechner B einen weiteren RPC machen soll). Dieser weitere Rechner könnte wiederrum Rechner A sein, es könnte aber auch ein dritter Rechner C sein. (der Sinn dieser Aufgabenstellung ergibt sich nur aus einem tiefgehenden Studium der Verteilte-Systeme-Vorlesung :*) )

Ich wollte die Datenstrukturen möglichst einfach halten, und hab mir gedacht dass ich einfach die IP-Adresse von Rechner C in die Nachricht reinpacke (wobei potientiell A==C sein kann). Dann liest Rechner B einfach die Daten, und baut eine Verbindung zu der IP-Adresse aus der Nachricht auf.
Dafür müsste aber Rechner A seine eigene IP-Addr wissen, damit er die dann an B schicken kann (dies ist für den Fall dass A==C. Wenn A!=C dann muss Rechner A die IP-Addr von C natürlich irgendwo anders herkriegen).

Ich habs jetzt so implementiert dass es in der Nachricht ein Flag gibt, und wenn dieses Flag gesetzt ist dann benutzt B einfach die Absenderadresse, ansonsten die Adresse aus der Nachricht. Das macht das natürlich etwas komplizierter, aber was eleganteres ist mir nicht eingefallen.


Warum schickst du nicht den Namen und laesst die Adresse erst bei Benutzung aufloesen? Es ist nun mal so, das je nachdem in welchen Netz man sich befindet, ein Rechner verschiedene Adressen haben kann, wobei der eigene DNS-Server die Richtige zurueckliefert.


Gut, die Aufgabe ist ja schon lange abgegeben, insofern ist es inzwischen egal… aber das nächste mal mach ich es so …


Auch im gleichen Netz kann ein Rechner mehrere IP-Adressen haben.

Es ist also gar nicht so trivial, wie es auf den ersten Blick aussieht :slight_smile: