web-dev-qa-db-de.com

Wie wähle ich auf localhost eine freie Portnummer aus?

Ich versuche, mit prozessübergreifender Kommunikation zu spielen, und da ich nicht herausfinden konnte, wie Named Pipes unter Windows verwendet werden, dachte ich, ich verwende Netzwerksockets. Alles passiert vor Ort. Der Server kann Slaves in einem separaten Prozess starten und auf einem Port lauschen. Die Sklaven erledigen ihre Arbeit und übermitteln das Ergebnis an den Master. Wie finde ich heraus, welcher Port verfügbar ist? Ich gehe davon aus, dass ich Port 80 oder 21 nicht abhören kann.

Ich benutze Python, wenn das die Auswahl einschränkt.

Vielen Dank!

142
Anton L.

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 mit sock.getsockname()[1] abrufen und an die Slaves weiterleiten, damit diese eine Verbindung herstellen können.

206
mark4o

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 nach bind() abrufen.

37
Havenard

Aus Gründen des Schnipsels dessen, was die Jungs oben erklärt haben:

import socket
from contextlib import closing

def find_free_port():
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
        s.bind(('', 0))
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        return s.getsockname()[1]
33
saaj

Sie können jeden gewünschten Port abhören. Im Allgemeinen sollten Benutzeranwendungen die Ports 1024 und höher (bis 65535) überwachen. 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 können Sie feststellen, 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 ausgeben, wenn die Bindung fehlschlägt.

Beachten Sie auch, dass die meisten Ihrer Sockets (für die Slaves) nicht explizit an bestimmte Portnummern gebunden werden müssen - nur Sockets, die auf eingehende Verbindungen warten (wie Ihr Master hier), müssen als Listener und an einen Port gebunden werden. Wenn für einen Socket kein Port angegeben wird, bevor er verwendet wird, weist das Betriebssystem dem Socket einen verwendbaren Port zu. Wenn der Master auf einen Slave antworten möchte, der Daten sendet, ist die Adresse des Absenders verfügbar, wenn der Listener Daten empfängt.

Ich nehme an, Sie werden UDP dafür verwenden?

2
Walt W