2017-04-07 20 views
0

私はサブプロセスを生成するプロジェクトを持っています。サブプロセスは再びバインドするポート番号を取ります。ポート番号は、私のPythonスクリプトによって割り当てられます。ここでは、49152と65535の間のランダムポートを取るだけです。ローカルポートがPythonで利用可能かどうか確認してください

ポートが使用可能で、ローカルシステム上の他のツール(* nix) 。

another questionから私はこのスニペットを持っている:

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" 

は、私は私の場合にはこれを使用できますか?これはポートを開けず、それ以上の使用のためにそれを閉じないでしょうか?

+1

[ローカルホストでは、空きポート番号を選ぶにはどうすればよいですか?](http://stackoverflow.com/questions/1365265/on- localhost-how-to-pick-a-free-port-number) – TessellatingHeckler

+0

@TessellatingHecklerこれは実際に非常に似ていますが、ランダムポートが利用可能かどうかを確認したいだけです。 Pythonスクリプトは、実際にはそれを実際に使用するべきではありません。 – SaAtomic

+1

この方法は、チェックと実際の使用の間に競合条件があるため、本来、障害が発生しています。 –

答えて

1

一時的なソケットを作成し、ポートにバインドして使用可能かどうかを確認するだけです。ポートが使用可能であることを検証した後、ソケットを閉じます。

def tryPort(port): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    result = False 
    try: 
     sock.bind(("0.0.0.0", port)) 
     result = True 
    except: 
     print("Port is in use") 
    sock.close() 
    return result 
+0

[コンテキストマネージャ](https://docs.python.org/2/library/contextlib.html#contextlib.closing)を使用できますか? 'with closed socket(...' –

+0

も参照してください[Pythonのソケットをコンテキストマネージャとして使用するには?](http://stackoverflow.com/questions/16772465/how-to-use-socket-in-python-コンテキストマネージャとして) –

1

コードは問題なく、ソケットを作成して接続しようとしています。すべてのポートを開いたり閉じたりしません。 sock.close()

関連する問題