ランダムなポート番号を割り当てるときに、Windows が誤って同じ番号を使用しないように、TCP ポートを予約して後でサービスにバインドしたいと考えています。レジストリと再起動によってこれが可能であることは知っていますが、そのような手間のかかる解決策は避けたいと思います。
プロセスがポートを実際にバインド/リッスンせずに予約し、要求に応じて安全に (つまり、競合状態を回避して) ポートを別のプロセスに渡すにはどうすればよいでしょうか?
ポート番号は事前に決定する必要はありません。最初のプロセスがランダムなポート番号を取得し、それを要求プロセスに渡すことは問題ありません。
編集:私の質問がやや不十分に述べられていることが私には起こります。私が本当に望んでいるのは、動的ポート番号の割り当てをポート 0 へのバインド操作から分離することです。これは、そのポート番号の偶発的なランダム割り当てを回避するだけでなく、その間に他のプロセスが同じアドレス/ポートにバインドするのを防ぐことも意味します。別の言い方をすれば、1 つのプロセスがポート 0 へのバインド操作を開始し (使用されるポート番号をすぐに学習し)、指定された 2 番目のプロセスが後でバインド操作を完了できるようにすることです。
現時点で、私が考えることができる最も近い回避策は、最初のプロセスが address/0 にすぐにバインドし、2 番目のプロセスがそれを要求するまでバインドされたままにすることです。取得され、アドレス/ポートに明示的にバインドされます。これには 2 つの問題があります。2) 第三者が偶発的に (または故意に) ポートを乗っ取る可能性があるわずかな時間間隔があります。
バックグラウンド
なぜ私がそんなに奇妙なことをしたいのか、あなたは興味があるかもしれません. 私は ZeroMQ をいじくり回してきましたが、主な制限の 1 つは、ipc://
Windows にトランスポートがないことです。ポート マッパー プロセス (RPC エンドポイント マッパー、または Erlang の epmd に似ています) はtcp://
、動的ポート割り当てを伴うトランスポートを使用して回避策を実装するためのチケットにすぎないことに気づきました。ただし、ZeroMQ クライアントとサーバーは順不同で接続することが許可されているため (つまり、サーバーがバインドする前にクライアントが接続することはエラーではありません)、接続しているクライアントがどのように検出できるかを理解しようとしています。確実性の高さ — サーバーが実際にそのポートにバインドする前に、通信に使用されるポート。