Windows で除外されたポートへの 2 つ目のバインドが失敗すると、エラー 10013 (WSAEACCES) が返されます

この記事では、SO_REUSEADDR オプションが設定されていても、除外されたポートを再度バインドできない問題を解決するためのヘルプを提供します。

適用対象: Windows Server 2012 R2
元の KB 番号: 3039044

現象

R2、Windows Server 2012、または Windows Server 2008 R2 Windows Server 2012実行しているコンピューターで次のコマンドを実行して、ポートを除外することを想定しています。

netsh int ipv4 add excludedportrange protocol = tcp startport = Integer numberofports = 1

さらに、コンピューター上の特定の TCP ポートにSO_REUSEADDR ソケットをバインドすることを想定しています。 この状況では、SO_REUSEADDR ソケットを TCP ポートに再度バインドしようとすると、バインドが失敗し、"WSAEACCES (10013)" エラーが発生します。

したがって、R2、Windows Server 2012、または Windows Server 2008 R2 で 2 つのバインドWindows Server 2012呼び出すアプリケーションを使用すると、正常に動作できません。

注:

  • 既定では、Windows Server 2008 R2 では、 コマンドを netsh 使用してポートを除外できません。 ただし、 修正プログラム 2665809を適用した後、オペレーティング システムはこの機能をサポートします。
  • この問題は、Windows Server 2008 または Windows Server 2003 では発生しません。

原因

この問題は、tcpip.sys ドライバーの問題が原因で発生します。 具体的には、tcpip.sys ドライバーが除外されたポートをバインドするときに、REUSE フラグが RESERVED フラグによって上書きされました。

回避策

この問題を回避するには、以下のいずれかの方法を使用します。

  • 既定のダイナミック ポート範囲 (49,152 ~ 65,535) に含まれていないポートを使用し、コマンドを実行 netsh してポートを除外ポートとして指定しないでください。
  • CreatePersistentTcpPortReservation 関数と LookupPersistentTcpPortReservation 関数を使用して、ポートを予約します。

状態

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

詳細

SO_REUSEADDR オプションの詳細については、 setsockopt 関数 を参照してください。