2017-04-07 4 views
0

Ich habe ein Projekt, wo ich Subprozesse spawn, die wiederum eine Port-Nummer zum Binden nehmen. Die Portnummer wird von meinem Python-Skript zugewiesen, wobei ich einfach einen zufälligen Port zwischen 49152 und 65535 nehme.Überprüfen, ob ein lokaler Port in Python verfügbar ist

Ich möchte überprüfen, ob der Port verfügbar ist und nicht von einem anderen Tool auf dem lokalen System verwendet wird (* nix) .

Von another question habe ich diesen Schnipsel:

import socket; 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
result = sock.connect_ex(('127.0.0.1',80)) 
if result == 0: 
    print "Port is open" 
else: 
    print "Port is not open" 

Kann ich dies in meinem Fall benutzen? Würde dies einen Port nicht öffnen und ihn nicht für die weitere Nutzung schließen?

+1

Mögliche Duplikate von [On localhost, wie eine freie Portnummer wählen?] (Http://stackoverflow.com/questions/1365265/on- localhost-how-to-pick-a-free-port-nummer) – TessellatingHeckler

+0

@TesselingHeckler Das ist in der Tat sehr ähnlich, aber ich will nur sehen, ob der zufällige Port verfügbar ist. Das Python-Skript sollte es nie wirklich für sich selbst verwenden. – SaAtomic

+1

Dieser Ansatz ist von Natur aus zum Scheitern verurteilt, weil Sie zwischen der Überprüfung und der tatsächlichen Verwendung eine Race-Bedingung haben - was, wenn in der Zwischenzeit jemand anderes diesen Port gestohlen hat? –

Antwort

1

Erstellen Sie einfach einen temporären Socket und versuchen Sie dann, an den Port zu binden, um zu sehen, ob er verfügbar ist. Schließen Sie den Socket, nachdem Sie überprüft haben, dass der Port verfügbar ist.

+0

Könnten Sie einen [context manager] (https://docs.python.org/2/library/contextlib.html#contextlib.closing) verwenden? 'mit closing socket (...' –

+0

Siehe auch [Wie benutze ich Socket in Python als Kontextmanager?] (http://stackoverflow.com/questions/16772465/how-to-use-socket-in-python- als Kontext-Manager) –

1

Der Code ist in Ordnung, es erstellt einen Socket und versucht, eine Verbindung herzustellen. Es öffnet oder schließt keine Ports. Sie müssen nur diese Zeile am Ende hinzufügen, um den Socket zu colozieren: sock.close()

Verwandte Themen