この記事では、SO_REUSEADDR オプションが設定されていても、除外されたポートを再度バインドできない問題を解決するためのヘルプを提供します。
元の KB 番号: 3039044
現象
Windows Server 2012 R2、Windows Server 2012、または Windows Server 2008 R2 を実行しているコンピューターで次のコマンドを実行して、ポートを除外するとします。
netsh int ipv4 add excludedportrange protocol = tcp startport = Integer numberofports = 1
さらに、SO_REUSEADDR ソケットをコンピューター上の特定の TCP ポートにバインドするとします。 この状況では、SO_REUSEADDR ソケットを TCP ポートに再度バインドしようとすると、バインドが失敗し、"WSAEACCES (10013)" エラーが表示されます。
そのため、Windows Server 2012 R2、Windows Server 2012、または Windows Server 2008 R2 で 2 つのバインドを呼び出すアプリケーションを使用すると、正しく動作しません。
Note
- 既定では、Windows Server 2008 R2 では、
netsh
コマンドを使用してポートを除外することはできません。 ただし、 hotfix 2665809を適用した後、オペレーティング システムはこの機能をサポートします。 - この問題は、Windows Server 2008 または Windows Server 2003 では発生しません。
原因
この問題は、tcpip.sys ドライバーの問題が原因で発生します。 具体的には、TCPIP.SYS ドライバーが除外されたポートをバインドするときに、REUSE フラグが RESERVED フラグによって上書きされました。
回避策
この問題を回避するには、以下のいずれかの方法を使用します。
- 既定の動的ポート範囲 (49,152 ~ 65,535) に含まれていないポートを使用し、
netsh
コマンドを実行してポートを除外ポートとして指定しないでください。 - ポートを予約するには、 CreatePersistentTcpPortReservation および LookupPersistentTcpPortReservation 関数を使用します。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
詳細
SO_REUSEADDR オプションの詳細については、 setsockopt 関数 を参照してください。