プロセス間通信を試してみましたが、Windowsで名前付きパイプを使用する方法がわからなかったので、ネットワークソケットを使用すると思いました。すべてがローカルで発生します。サーバーは別のプロセスでスレーブを起動し、いくつかのポートで待機します。スレーブは作業を行い、結果をマスターに送信します。どのポートが利用可能かを知るにはどうすればよいですか?ポート80または21でリッスンできないと思いますか?
私はPythonを使用していますが、それによって選択肢が減ります。
ありがとう!
プロセス間通信を試してみましたが、Windowsで名前付きパイプを使用する方法がわからなかったので、ネットワークソケットを使用すると思いました。すべてがローカルで発生します。サーバーは別のプロセスでスレーブを起動し、いくつかのポートで待機します。スレーブは作業を行い、結果をマスターに送信します。どのポートが利用可能かを知るにはどうすればよいですか?ポート80または21でリッスンできないと思いますか?
私はPythonを使用していますが、それによって選択肢が減ります。
ありがとう!
回答:
特定のポートにバインドしたり、ポート0にバインドしたりしないでくださいsock.bind(('', 0))
。次に、OSが使用可能なポートを選択します。を使用して選択したポートを取得し、sock.getsockname()[1]
それをスレーブに渡して、スレーブが再び接続できるようにすることができます。
sock.bind(('',0))
みんなが上で説明したことの抜粋のために:
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]
s.bind(('localhost', 0))
より良い
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
この場合本当に役に立ちますか?私が読んだことから、バインドしようとしているソケットが持っSO_REUSEADDR
ていることだけが関係し、そのフラグが残っているソケットに設定されているかどうかは関係ありません。
好きなポートでリッスンできます。通常、ユーザーアプリケーションは、1024以上のポート(65535まで)をリッスンする必要があります。リスナーの数が可変の場合の主なことは、アプリに範囲を割り当てることです。たとえば、20000〜21000、およびCATCH EXCEPTIONSです。これにより、コンピュータでポートが使用できない(つまり、別のプロセスで使用されている)かどうかがわかります。
ただし、この場合、バインドが失敗した場合にエラーメッセージを出力する限り、リスナーにハードコードされた単一のポートを使用しても問題はありません。
ほとんどのソケット(スレーブ用)を特定のポート番号に明示的にバインドする必要がないことにも注意してください。ここでのマスターのように、着信接続を待機するソケットのみをリスナーにしてポートにバインドする必要があります。ソケットが使用される前にポートが指定されていない場合、OSは使用可能なポートをソケットに割り当てます。マスターがデータを送信するスレーブに応答する場合、リスナーがデータを受信すると送信者のアドレスにアクセスできます。
これにUDPを使用すると思いますか?