Windows で除外されたポートへの 2 回目のバインドが失敗したときにエラー 10013 (WSAEACCES) が表示される

適用対象: Windows Server 2012 R2 DatacenterWindows Server 2012 R2 StandardWindows Server 2012 R2 Essentials

現象


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 つのバインドを呼び出すアプリケーションを使用する場合、アプリケーションは正常に動作できません。

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

原因


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

回避策


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

状況


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

詳細


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