web-dev-qa-db-ja.com

通常、各ソケットの使用は1回のみ許可されます

Windowsですでに使用されているポート(たとえば、同じソケットサーバーの2つのインスタンスを実行している)でリッスンしようとすると、次のようになります。

[WinError 10048]通常、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)の使用は1回のみ許可されます

各アドレスの使用が1つだけ許可されている理由が混乱しています通常許可されています。私はこれが絶対的なルールであるという印象を受けましたが(少なくともUnixでは)、明らかにそうではありませんでした。同じソケットアドレスを使用する2つのプログラムが存在する可能性があるのはどのような場合(およびどのように)ですか?それとも私はこのエラーを誤解していますか?

3
baum

これは、すべてのUNIXシステムで絶対的なルールではありません。複数のプロセスが同じアドレスとポートの組み合わせにバインドできるようにする拡張機能を備えているものもあり、カーネルは複数のリスナーへの着信接続の分散を処理します。これの利点は、アプリケーションが接続自体の多重化を処理する必要がなく、代わりに接続の処理について心配するだけでよいことです。これにより、ネットワークコードで並列処理を可能にするメカニズムをすばやく簡単に実装できます。

Linuxでは、このためのソケットオプションはSO_REUSEPORTと呼ばれ、広く使用されている多くの高性能サーバーソフトウェア(Apache HTTPDやnginxなど)がそれを使用することをサポートしています。

Windowsは、4.4BSDネットワークコードの大部分が直接のクローンを使用しているため、ソケットオプションの概念は同じであり、これを制御するための独自のオプションがあります。 このStackOverflowの回答 によると、問題のオプションはSO_REUSEADDRと呼ばれ、SO_EXCLUSIVEADDRUSEと呼ばれる同等の「アンチオプション」があります。

複数の異なるプログラムがこのオプションを使用して同じポートにバインドすることを妨げるものは何もないことに注意してください。これは、ネットワークの問題をデバッグするときにあらゆる種類の頭痛の種につながる可能性があり、セキュリティ上の重要な考慮事項でもあります。

3