Identifizieren C++ - Socket-port-Nummer
Ok, so kann ich ein socket erstellen und senden einer Nachricht zu einer entfernten Maschine UDP (btw). Mein problem ist, dass ich brauche, um zu wissen, welchen port ich schickte die Nachricht auf. Die remote-Maschine zu reagieren, die auf den gleichen port, den ich geschickt aus. Jetzt es scheint zu sein, Kommissionierung zufällige hohe ports wie 46555. Gibt es eine Möglichkeit zu definieren, welchen port es geht raus oder gibt es irgendeine Möglichkeit herauszufinden, was die port-Nummer ist?
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während die Wahl eines spezifischen Ausgangs-port gemacht werden kann, es ist nicht die Art und Weise ist dies in der Regel gehandhabt.
Normalerweise wählt der Kunde eine zufällige, hoch-nummeriert-Anschluss (wie er tut) und dann wird der server erkennen, welcher port wird vom client verwendet, und Antworten auf diesem port. Mit POSIX (Berkeley -) sockets, würde der server diese Informationen erhalten, über die
recvfrom
Funktion, im Gegensatz zu denrecv
Funktion. Dierecvfrom
Funktion nimmt zwei zusätzliche Argumente, die Sie füllen wird mit der Adresse, dass das Paket empfangen wurde, einschließlich port-Nummer.recv()
auf der gleichen Steckdose, die Siesend()
, und Sie hören auf dem gleichen port, es geschickt aus.Die kurze Antwort auf Ihre Frage ist "bind()", vorausgesetzt, eine Schnittstelle, die BSD-socket-ish.
Die längere Antwort ist
wo fd ist der Datei-Deskriptor für den socket. Aber warten Sie, Sie zu Fragen, was ist dieses "addr", und warum ist es ein Zeiger auf eine struct sockaddr?
In Ihrem Fall, addr ist
Ist ein Internet-sockaddr-Struktur (ein Zeiger auf die gewirkt werden kann, um die grundlegenden struct sockaddr). Rufen Sie vor dem binden, müssen Sie zur Initialisierung der Adresse:
Nach aclling binden, der socket wird an den port, den Sie gewählt haben, anstatt ein random ein und Sie können senden und empfangen von UDP Nachrichten auf diesem port.
Beim senden einer Nachricht von der Quelle-Maschine, die Sie senden Sie es an eine bestimmte IP und PORT.
Auf der remote-Maschine, die Sie benötigen, einen socket zu öffnen, und binden Sie den socket zu hören, die auf einem bestimmten port.
In jedem Fall, geben Sie den port auf beiden Geräten (mit den üblichen api ' s).
Die Buchse an der remote-Maschine hört auf einen bestimmten port, die Sie definieren können.
Gibt es viel info in beej ' s guide
Hier ist ein Weg, um zu bestimmen, die port-Nummer von einem lokalen client-Seite UDP-socket:
Vorausgesetzt, eine POSIX-basierte Implementierung, die Funktionen
getsockname()
undgetpeername()
Arbeit, zumindest für stream sockets. Dierecvfrom()
undsendto()
Funktionen können Sie abrufen und verwenden der Informationen für die UDP-sockets.Wenn man mit Windows arbeitet, diese Funktionen wahrscheinlich existieren (wahrscheinlich mit einem Unterstrich als Präfix), aber es gibt auch einheimische alternativen, die eine Suche auf MSDN auftauchen wird.
Sollten Sie in der Lage sein, den Anschluss, den Sie rufen, wenn Sie Sie initialisieren der socket. Ich wünschte, ich könnte weniger vage, aber es hängt davon ab, was socket-Implementierung, die Sie verwenden. Zum Beispiel (aus der .NET framework):
Verwendet, mit den zugehörigen IPEndpoint-Klasse,
Wird, können Sie Ihre binden Ihre Steckdose zu einem lokalen Endpunkt, den Sie wünschen. Optional kann der port auf null, um es automatisch Ihnen zugeordnet. Es gibt auch eine option, um die IP-Adresse festlegen, INADDR_ANY, die entmutigt.
Betrachten verbunden UDP-sockets - erhalten Sie bessere Leistung und eine ICMP-error-reporting.
Einen Weg, um fix ein port wäre, die Nutzung
bind()
, mit diesem können Sie senden auf einen bestimmten port auf dem client. Beachten Sie, sollten Sie vorsichtig sein, nicht die standard-ports. Dieser link wird Ihnen helfen, mit den details http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-en-4/ch-ports.htmlKönnen Sie
bind
und dann das senden und empfangen von Paketen.Beej ' s guide ist ein guter Ort, um ein einfaches Verständnis der socket-Programmierung.
https://beej.us/guide/bgnet/html/single/bgnet.html#bind