Ich versuche, mit der Kommunikation zwischen Prozessen zu spielen, und da ich unter Windows nicht herausfinden konnte, wie Named Pipes verwendet werden, dachte ich, ich werde Netzwerk-Sockets verwenden. Alles passiert vor Ort. Der Server kann Slaves in einem separaten Prozess starten und überwacht einen Port. Die Sklaven erledigen ihre Arbeit und senden das Ergebnis an den Master. Wie finde ich heraus, welcher Port verfügbar ist? Ich nehme an, ich kann Port 80 oder 21 nicht abhören.
Ich benutze Python, wenn das die Auswahl einschränkt.
Vielen Dank!
Antworten:
Binden Sie nicht an einen bestimmten Port oder an Port 0, z
sock.bind(('', 0))
. Das Betriebssystem wählt dann einen verfügbaren Port für Sie aus. Sie können den ausgewählten Port abrufensock.getsockname()[1]
und an die Slaves weiterleiten, damit diese wieder eine Verbindung herstellen können.quelle
sock.bind(('',0))
Zum Ausschnitt dessen, was die Jungs oben erklärt haben:
quelle
s.bind(('localhost', 0))
ist bessers.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
in diesem Fall wirklich? Nach dem, was ich gelesen habe, ist es nur relevant, dass der Socket, der zu binden versucht, hat,SO_REUSEADDR
und es ist irrelevant, ob dieses Flag auf dem verweilenden Socket gesetzt ist.Binden Sie den Socket an Port 0. Ein zufälliger freier Port von 1024 bis 65535 wird ausgewählt. Sie können den ausgewählten Port mit
getsockname()
direkt danach abrufenbind()
.quelle
Sie können jeden gewünschten Port abhören. Im Allgemeinen sollten Benutzeranwendungen die Ports 1024 und höher (bis 65535) abhören. Wenn Sie eine variable Anzahl von Listenern haben, müssen Sie Ihrer App hauptsächlich einen Bereich zuweisen, z . B. 20000-21000 und CATCH EXCEPTIONS . Auf diese Weise wissen Sie, ob ein Port auf Ihrem Computer unbrauchbar ist (dh von einem anderen Prozess verwendet wird).
In Ihrem Fall sollten Sie jedoch kein Problem damit haben, einen einzelnen fest codierten Port für Ihren Listener zu verwenden, solange Sie eine Fehlermeldung drucken, wenn die Bindung fehlschlägt.
Beachten Sie auch, dass die meisten Ihrer Sockets (für die Slaves) nicht explizit an bestimmte Portnummern gebunden sein müssen - nur Sockets, die auf eingehende Verbindungen warten (wie Ihr Master hier), müssen zu einem Listener gemacht und an einen Port gebunden werden. Wenn für einen Socket vor seiner Verwendung kein Port angegeben wurde, weist das Betriebssystem dem Socket einen verwendbaren Port zu. Wenn der Master auf einen Slave antworten möchte, der ihm Daten sendet, ist die Adresse des Absenders zugänglich, wenn der Listener Daten empfängt.
Ich nehme an, Sie werden dafür UDP verwenden?
quelle
Wenn Sie nur einen freien Port für die spätere Verwendung suchen müssen, finden Sie hier einen Ausschnitt, der einer vorherigen Antwort ähnelt , jedoch mit socketserver kürzer ist :
Beachten Sie, dass nicht garantiert wird, dass der Port frei bleibt. Daher müssen Sie dieses Snippet und den Code, der es verwendet, möglicherweise in eine Schleife einfügen.
quelle