web-dev-qa-db-ja.com

ローカルホストで、空きポート番号を選択するにはどうすればよいですか?

プロセス間通信をしようとしていますが、Windowsで名前付きパイプを使用する方法がわからなかったので、ネットワークソケットを使用すると思いました。すべてはローカルで行われます。サーバーは、別のプロセスでスレーブを起動し、いくつかのポートでリッスンすることができます。スレーブは作業を行い、結果をマスターに送信します。どのポートが利用可能かを知るにはどうすればよいですか?ポート80または21でリッスンできないと思いますか?

Pythonを使用していますが、それが選択肢を減らす場合です。

ありがとう!

142
Anton L.

特定のポートにバインドしたり、ポート0にバインドしたりしないでください。 sock.bind(('', 0))。その後、OSは使用可能なポートを選択します。 sock.getsockname()[1]を使用して選択されたポートを取得し、スレーブに渡して接続し直すことができます。

206
mark4o

ソケットをポート0にバインドします。1024〜65535のランダムな空きポートが選択されます。 getsockname()の直後のbind()を使用して、選択したポートを取得できます。

37
Havenard

連中が上で説明したことの断片のために:

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

必要なポートでリッスンできます。通常、ユーザーアプリケーションは1024以上のポート(65535まで)をリッスンする必要があります。リスナーの数が可変の場合の主なことは、アプリに範囲を割り当てることです-たとえば20000-21000、およびCATCH EXCEPTIONS。これは、ポートがコンピューター上で使用できない(つまり、別のプロセスで使用されている)かどうかを知る方法です。

ただし、この場合、バインドが失敗した場合にエラーメッセージを出力する限り、リスナーに単一のハードコードポートを使用しても問題はありません。

また、ほとんどのソケット(スレーブ用)を特定のポート番号に明示的にバインドする必要がないことに注意してください-着信接続を待機するソケット(ここのマスターのような)のみがリスナーになり、ポートにバインドされる必要があります。使用される前にポートがソケットに指定されていない場合、OSは使用可能なポートをソケットに割り当てます。マスターがデータを送信するスレーブに応答する場合、リスナーがデータを受信すると送信者のアドレスにアクセスできます。

これにUDPを使用すると思いますか?

2
Walt W