Reservieren Sie einen TCP-port in Windows

Ich würde gerne reservieren, um einen TCP-port gebunden zu sein, die von einem Dienst später, so dass Windows nicht versehentlich die gleiche Nummer bei der Zuweisung zufällige port-Nummern. Ich weiß, dies ist möglich über die registry und Neustart, aber ich möchte vermeiden, solche eine plumpe Lösung.

Wie kann ein Prozess reservieren Sie einen port, ohne tatsächlich verbindlich, höre es, und dann sicher (D. H., die Vermeidung von race-conditions) hand es über zu einem anderen Prozess auf Anfrage?

Die port-Nummer muss nicht im Voraus bestimmt werden. Es ist OK für den ersten Prozess zu erwerben, eine zufällige port-Nummer, und übergeben es an den anfordernden Prozess.

EDIT: Es fällt mir auf, dass meine Frage etwas schlecht erklärt. Was ich wirklich will, ist die Trennung der Zuordnung einer dynamischen port-Nummer aus der bind-to-port-null-operation. Dies bedeutet nicht nur die Vermeidung der zufälligen der zufälligen Zuordnung der port-Nummer, aber auch verhindert, dass andere Prozesse, die aus der Bindung an die gleiche Adresse/port in der Zwischenzeit. Oder, setzen Sie eine andere Weise, ich will ein Prozess zum starten des bind-to-port-null Betriebs — sofort lernen Sie die port-Nummer verwendet werden — und lassen einen nominiert zweiten Prozess vervollständigen Sie die bind-operation irgendwann in der Zukunft.

Im moment, die nächsten work-around, den ich denken kann, ist für den ersten Prozess zu binden-Adresse/0 sofort, und bleiben gebunden, bis der zweite Prozess anfordert, an welcher Stelle es entbindet und erzählt den anderen Prozess der port-Nummer erworben, die dann bindet an die Adresse/den port explizit an. Dies hat zwei Probleme: 1) ich möchte lieber nicht binden, bis der zweite Prozess kommt; 2) es gibt ein kleines Zeitintervall, in dem eine Dritte Partei könnte versehentlich (oder absichtlich) an sich zu reißen Hafen.

Hintergrund

Können Sie möglicherweise neugierig, warum ich Wünsche, etwas zu tun, so seltsam. Ich habe liebäugelt mit ZeroMQ, und eine bedeutende Einschränkung ist das fehlen der ipc:// transport auf Windows. Es fiel mir auf, dass ein port-mapper-Prozess (ähnlich dem RPC-Endpunkt-mapper, oder Erlang die epmd) würde genau das richtige sein, um zu implementieren ein work-around, mit der tcp:// transport mit dynamischer port-Zuweisungen. Jedoch, ZeroMQ-clients und-Server eine Verbindung herstellen dürfen, die außerhalb der Reihenfolge (D. H., es ist nicht ein Fehler, wenn der client eine Verbindung herstellen, bevor der server bindet), so versuche ich herauszufinden, wie eine verbindende client entdecken können — mit einem sehr hohen Maß an Sicherheit — der port, der verwendet wird, um zu kommunizieren, bevor ein server tatsächlich bindet an diesen port.

InformationsquelleAutor der Frage Marcelo Cantos | 2011-03-10

Schreibe einen Kommentar