Als Client mache ich eine socket()
, es gibt mir eine Nummer, die ich in sktnum
speichern. Ich mache dann eine connect()
mit sktnum
und die Remote-Adresse. Hey Presto, es ist erfolgreich, und mir wurde gesagt, dass der Kernel eine lokale IP-Adresse und Port-Nummer ausgewählt hat (damit der Server weiß, wohin er zurücksendet). Welche Funktion (Linux C/C++) rufe ich an, um herauszufinden, welchen Port und welche IP-Adresse der Kernel ausgewählt hat. (Und bitte seien Sie nicht einer dieser Leute, die sagen "Warum wollen Sie wissen")Welche Funktion sagt mir, an welche Adresse der Kernel den lokalen Socket gebunden hat?
Antwort
Ich bin mir nicht sicher, ob ich Ihre Frage richtig verstehe. Ich verstand es die folgende Art und Weise:
Computer "A" verwendet
socket()
undconnect()
eine TCP-Verbindung zum Computer "B" zu schaffen, die unter Verwendung vonsocket()
,bind()
,listen()
undaccess()
.Die IP-Adresse und TCP-Port am Computer "B" ist bekannt (natürlich - Sie eine Verbindung zu einem bestimmten TCP-Port auf einem bestimmten Computer).
Aber wie ist es möglich, die IP-Adresse und den TCP-Port auf Computer "A" herauszufinden, die zu dieser Verbindung gehören?
Die Funktion, die das auf Computer "A" tun wird, ist getsockname()
.
Auf Computer "B" getpeername()
wird diese Informationen zurückgeben. Wenn der Computer "B" mehrere IP-Adressen hat (z. B. mehrere Netzwerkkarten), kann der Computer "B" auch getsockname()
verwenden, um seine eigene IP-Adresse zu erhalten.
Vor dem Aufruf connect()
hat der Socket noch keine Portnummer und keine IP-Adresse. So ruft getsockname()
vor dem Aufruf connect()
keinen Sinn.
Der Grund dafür ist einfach: Wenn ein Computer mehrere Netzwerkkarten mit unterschiedlichen IP-Adressen hat, kann die IP-Adresse auf der Seite des Computers "A" nicht bekannt sein, bevor bekannt ist, welche der Netzwerkkarten verwendet werden muss. (Beachten Sie, dass localhost
gesehen wird als separate "Netzwerkkarte" mit der IP-Adresse 127.0.0.1 durch das O!)
EDIT
Aber ich glaube, Sie könnten nur erhalten ... 192.168. ... Es gibt Ihnen nicht die ... IP-Adresse, die Sie im Internet zugewiesen haben. Ihr Problem kann auf folgende Weise erklärt werden:
Die ursprüngliche Idee des Internets war, dass jeder Computer seine eigene globale IP-Adresse hat (das ist, was Sie rufen: „Adressen, die Sie im Internet zugeordnet sind“).
Diese Idee hat sich nie geändert: Fast jede PC-Software (einschließlich Betriebssystem) ist für Computer mit einer globalen IP-Adresse geschrieben.
Da Ihr Provider Ihnen nur eine IP-Adresse geben kann, "täuscht" Ihr Router Ihre Computer, indem er ein Internet "simuliert", in dem die lokalen Computer globale Adressen haben (z. B. im Bereich 192.168.).
Aufgrund dieser "Simulation" kann sich der Computer genauso verhalten wie 192.168.x.y ist seine globale IP-Adresse im Internet. Der Computer hat nicht einmal Informationen darüber, dass dies keine globale IP-Adresse ist!
So ist es klar, dass diese Funktionen 192.168.x.y zurückgeben, weil das Betriebssystem "denkt", dass dies die globale Adresse im Internet ist!
Das einzige Gerät, das Informationen über die reale globale Adresse (und über den echten TCP-Port !!!) hat, ist der Router!
Viele Anbieter verwenden CGNAT, was bedeutet, dass sogar mehrere Internetverbindungen eine IP-Adresse teilen. In diesem Fall ist das einzige Gerät mit diesen Informationen der Router des Anbieters.
Wenn Sie die echte IP-Adresse und den echten TCP-Port (wie aus dem Internet gesehen) benötigen, erhalten Sie diese Informationen vom Router. Abhängig vom Router-Modell wird es nicht möglich sein, Informationen über die tatsächlichen Adressen zu erhalten.
Ich bezweifle, dass es einen Router auf dem Markt gibt, mit dem Sie den echten TCP-Port auslesen können.
Dies war ein Grund, warum IPv6 entwickelt: Mit IPv6 jedem Computer wieder seine eigene IP-Adresse haben kann ...
Martin - Ich glaube nicht, dass Sie Recht haben. getsockname() benötigt vom Aufrufer einen Socket-Dateideskriptor (sockfd). Aber wir würden den Einheimischen nicht kennen. Wir kennen das, was wir mit socket() erstellt haben, aber als wir es mit connect() benutzt haben, wurde es mit der REMOTE-IP-Adresse verknüpft, nicht mit der lokalen. – Clive
Ich denke, ich habe vielleicht eine Antwort ausgearbeitet, aber es reicht immer noch nicht für das, was ich will. Sie könnten gethostname() verwenden und dann getaddrinfo(), was es zurückgibt. Aber ich denke, dass Sie nur 127.0.0.1 oder eine Adresse 192.168 erhalten. usw., was das Gateway (Router) Ihnen möglicherweise in einem DHCP-Vorgang zugeteilt hat. Es gibt Ihnen nicht die (temporäre) IP-Adresse, die Sie im Internet zugewiesen haben. – Clive
@Clive Bitte sehe meine Bearbeitung: Sorry, aber ich denke was du machen willst ist nicht möglich. –
- 1. Welche Adresse wird für den lokalen TCP-Server verwendet?
- 2. Welche Funktion hat sudo?
- 3. An welche Adresse beginnt der x86?
- 4. Abrufen einer DNS-Abfrage in C an Port 53. An welche Adresse muss gebunden werden?
- 5. Welche Funktion hat SOCK_STREAM?
- 6. Welche Ereignisse sind gebunden?
- 7. Kann mir jemand erklären, welche Funktion ($) hat in jQuery
- 8. Welche Funktion hat dieser Codeausdruck?
- 9. Welche Funktion hat der Dekorator "implements_iterator"?
- 10. Welche Funktion hat die Kontextauswertung
- 11. Welche Funktion hat Exif-Daten?
- 12. Welche Ereignisse können an einen Tkinter Frame gebunden werden?
- 13. Welche Methoden existieren für den lokalen Remoteprozeduraufruf?
- 14. Kann nicht an Adresse gebunden werden, nachdem Socket-Programm abstürzt
- 15. Welche Funktion hat diese Funktion hier?
- 16. Welche besonderen Kräfte hat ashmem?
- 17. Welche Bedeutung hat x in der Adresse einer Variablen?
- 18. Welche Planungsalgorithmen verwendet der Linux-Kernel?
- 19. Django Runserver an 0.0.0.0 gebunden, wie kann ich herausfinden, welche IP die Anfrage angenommen hat?
- 20. Matrix Iterating: Welche Funktion hat dieser Code?
- 21. Welche Funktion hat enumerate in meinem Code?
- 22. Auf welche Adresse zeigt "& ref_var"?
- 23. Welche Android-Anwendungskomponenten können an einen Dienst gebunden werden?
- 24. kann der Compiler mir mitteilen, welche Überladungs- oder Template-Funktion er gewählt hat?
- 25. Wie kann ich GDB dazu bringen, mir mitzuteilen, welche Adresse einen Fehler verursacht hat?
- 26. Welche Funktion hat der HTTP-Header "Vary: Accept"?
- 27. Wie kann ich sehen, welche jQuery-Funktion an das Element gebunden ist?
- 28. Welche Argumente gibt der addEventListener an meine Funktion weiter?
- 29. C#: Erkennen, welche Anwendung den Fokus hat
- 30. Welche Funktion hat der Untertyp in diesem Scala-Beispiel?
https://stackoverflow.com/questions/30597111/get-local-port-used- by-socket – melpomene