Holen Sie sich zufällige port für UDP-socket
Ich muss ein Programm erstellen, wird die Kommunikation mit anderen Programmen auf dem gleichen Rechner über UDP-sockets. Es liest Befehle von der Standardeingabe, und einige dieser Befehle wird es zum senden/empfangen von Paketen, ohne anhalten der Ausführung. Ich habe einige Informationen gibt, aber da bin ich nicht vertraut mit socket-Programmierung, und müssen dies schnell erledigt, ich habe folgende Fragen:
- Ich brauche, um einen zufälligen freien port für das Programm zu hören, und behalten es so anderen Programmen kommunizieren kann, die mit dieser und auch der Hafen ist nicht reserviert, von einem anderen Programm. Ich auch speichern müssen Sie die port-Nummer auf eine variable für die zukünftige Verwendung.
- Da die Kommunikation über Prozesse auf der gleichen Maschine, ich Frage mich, ob ich verwenden kann, PF_LOCAL.
Auch ein code-Beispiel an die Einrichtung einer solchen Buchse wäre willkommen, ebenso wie ein Beispiel für das senden/empfangen von Zeichenketten.
Für welche Plattform?
Linux-OS mit standar-Bibliotheken
Warum die Kommunikation zwischen Prozessen über einen socket? Ist es nur für den Willen doin' es? 😉
Linux-OS mit standar-Bibliotheken
Warum die Kommunikation zwischen Prozessen über einen socket? Ist es nur für den Willen doin' es? 😉
InformationsquelleAutor rabusmar | 2012-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Call
bind()
Angabe von port 0. Dass es der OS: wählen Sie eine nicht verwendete port. Sie können dann mitgetsockname()
zu retreive dem gewählten port.Ich nehme an, wenn Sie wollten einen wirklich zufälligen port, könnten Sie immer wieder versuchen zu binden ((rand()%65535)+1), bis die bind-Erfolg gibt.
Es wird zufällig sein, dass Sie nicht wissen, welchen port ausgewählt ist, bis die Bindung erfolgreich ist. Die Bindung an port 0 können Sie das Betriebssystem wählen Sie den ersten verfügbaren, nicht verwendeten port. Wenn
bind()
erfolgreich ist, sind Sie garantiert, um einen port, der ist nur für dich und niemand anderen. Ihre genannten Voraussetzungen nicht benötigen, um wirklich zufällige persay, einfach einmalig, und wird es sein.Ich denke, der port zurückgegeben bind(.., 0) ist nicht so gut für dauerhafte Nutzung; siehe meine Antwort für die details.
InformationsquelleAutor Remy Lebeau
Antwort von Remy Lebeau ist gut, wenn Sie benötigen eine temporäre port. Es ist nicht so gut, wenn Sie benötigen eine persistente reservierten port zu verwenden, da andere software verwendet auch die gleiche Methode, um einen Anschluss (inklusive OS-TCP-stack, die einen neuen temporären port für jede Verbindung).
So kann Folgendes passieren:
Dann müssen Sie Z. B. starten Sie die software:
Also für die "Zukunft nutzt" Sie müssen einen port, der nicht in ephemeral port range (das ist der Bereich, aus dem bind(host, 0) gibt einen port).
Meine Lösung für dieses Problem ist die port-für -Befehlszeilen-Dienstprogramm.
Wenn mein Verständnis der Frage richtig ist (esp. "1"), fragt er nach. Ist dies nicht der Fall, obwohl. Der use-case ist nicht für die Benutzer zu gewährleisten, der Anschluss ist immer vorhanden, aber um eine software-Gewährleistung der port verfügbar ist.
InformationsquelleAutor Mikhail Korobov
Wenn es einen zufälligen port ist tatsächlich wichtig, Sie sollte etwas tun wie:
Dann geben Sie diesen port in binden. Wenn es fehlschlägt, wählen Sie eine neue ein (keine Notwendigkeit zu re-seed des Zufallsgenerators. Wenn die random-port ist nicht wichtig, den Blick auf Remy Lebeau ' s Antwort.
Stimmt, obwohl die Wahrscheinlichkeit, dass Sie würde wiederholen Sie die ports in der pseudo-random-Sequenz zu finden, bevor ein offener port an sich ist ziemlich niedrig.
InformationsquelleAutor dbeer