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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit netsh Befehl könnte dir helfen. Sie können den dynamischen port-Bereich von Windows verwendet wird.
Es ist wie mit der registry änderung, die Sie angegeben, aber es wird sofort wirksam.
finden Sie unter: http://support.microsoft.com/kb/929851 für details über netsh-Befehl.
InformationsquelleAutor der Antwort vahapt
Wie erwähnt von @vahapt können Sie ändern die dynamic port range mit
netsh
.Jedoch eine bessere Lösung kann mit netsh die Reservierung der ports, die für Ihre Anwendung erforderlichen, verlassen, allein der Standardbereich der dynamischen ports.
Tun:
Beenden Sie alle Prozesse mit den ports reserviert werden. Wenn ein Prozess einen port enthalten in den Bereich von ports zu reservieren, NETSH, wird die folgende Fehlermeldung zurück und die Reservierung wird scheitern:
Verwenden Sie den folgenden NETSH-Befehl die Reservierung der ports:
netsh int <ipv4|ipv6> Add excludedportrange [protocol=]tcp|udp [startport=]<integer> [numberofports=]<integer> [[store=]active|persistent]
Beispielsweise zu reservieren ports 55368-55372 für UDPv6, verwenden Sie den Befehl:
netsh int ipv6 add excludedportrange protocol=udp startport=55368 numberofports=5
Hinweise:
Sehen https://support.microsoft.com/en-us/kb/929851 für weitere Informationen, einschließlich der Informationen zum anzeigen oder löschen Sie einen vorhandenen port-Reservierung.
InformationsquelleAutor der Antwort Twisty Impersonator
Edit: Dies gilt nur für pre-Windows Server 2008 (Microsoft Support KB)
Können Sie Bearbeiten die "ReservedPorts" Registry-Einstellung in
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Reservieren Sie einen Bereich von ports führen Sie die format - '4000-4010' oder 'xxxx-yyyy' allerdings reservieren, um einen einzelnen port benutzen Sie das format '4000-4000' oder 'xxxx-xxxx'
http://support.microsoft.com/kb/812873
InformationsquelleAutor der Antwort edhurtig
Habe ich eine mögliche Lösung, so dachte ich, kann ich da auch Dokument es hier als Antwort.
Einen Prozess über einen socket auf einen anderen Prozess über einen Aufruf von WSADuplicateSocket, so dass eine Koordinierung der Verfahren konnte eine Bindung an einen dynamischen port, intern und verknüpfen es mit einer bestimmten IPC-Namen. Wenn ein ZMQ server-Prozess wollen, zu "binden", zu diesem Namen gekommen ist, ist die Koordination von Prozess-Kopien der gebundenen socket an den server-Prozess und schließt seine eigene Kopie.
Diese Lösung nicht meine Vorliebe zu vermeiden, den Aufruf von bind(), aber das ist vielleicht nicht unbedingt nötig; ich werde einige tests durchführen.
InformationsquelleAutor der Antwort Marcelo Cantos
Für ZeromMQ, können Sie die
zbeacon
Modul aus czmq oder C# NetMq zu implementieren, service discovery.InformationsquelleAutor der Antwort dkrikun