2012-03-25 9 views
2

Ich schreibe ein Client/Server-Programm mit C-Sockets. Ich gebe an, dass der Server auf jedem Netzwerk-Interface mit INADDR_ANY in sockaddr_in.sin_addr.s_addr abhören kann. Dies entspricht einer IP von 0.0.0.0. Ist es mir möglich, die tatsächliche IP-Adresse zu erhalten, die der Server überwacht? (z. B. 192.168.1.100)C Hole IP für den Abhörserver

+0

Bevor oder nachdem eine Verbindung hergestellt wurde? Der Server könnte mehrere Adressen abhören. – blueshift

+0

Vorher. In meinem Fall werde ich nur eine IP haben. Nur dass ich das System entscheiden lasse. Aber ich will immer noch wissen, was es entscheidet. – Gigi

+3

Der Server wird * alle * Schnittstellen abhören, die verfügbar sind. Auch eine einzelne Schnittstelle kann mehrere IP-Adressen haben. –

Antwort

0

Ich konnte endlich eine solution that works finden.

Bearbeiten: Verbindung ist tot, so siehe: Internet Archive link.

Hoffentlich kann es für andere hilfreich sein, wie es für mich war.

+0

Ich hoffe, dass Sie keine IPv6-Unterstützung benötigen, weil dies nicht für IPv6 funktioniert. –

+0

Nein, das tue ich nicht. Aber es könnte denen helfen, die es tun, wenn Sie erklären, warum es nicht geeignet ist. Ich denke, die verwendeten Funktionsaufrufe haben IPv6-Äquivalente. – Gigi

+1

Die 'getaddrinfo'-Funktion ([linux docs] (http://linux.about.com/library/cmd/blcmdl3_getaddrinfo.htm), [Windows-Dokumentation] (http://msdn.microsoft.com/en-us/) Bibliothek/Windows/Desktop/ms738520 (v = vs.85) .aspx)) ist IPv6-aware und führt die gleiche Funktion aus. –

1

Wenn Sie einen abhörenden Socket an INADDR_ANY binden, überwacht der Socket alle verfügbaren lokalen IP-Adressen. Es gibt keine Möglichkeit, aus dem Socket zu ermitteln, welche IP (s) es abgehört hat. Wenn Sie diese Informationen benötigen, müssen Sie die lokalen IP-Adressen separat aufzählen (in diesem Fall können Sie einfach jede IP einzeln an ihren eigenen Socket senden, wenn Sie die Pre-Accept-Bindungsdetails erneut abrufen müssen). Sobald jedoch accept() eine bestehende Clientverbindung zurückgegeben hat, können Sie getsockname() auf dem akzeptierten Socket verwenden, um zu erfahren, welche bestimmte IP die Verbindung akzeptiert hat.