Поделиться через


Ошибка 10013 (WSAEACCES) возвращается при сбое второй привязки к исключенным порту в Windows

В этой статье показано, как решить проблему, из-за которой невозможно снова привязать исключенный порт, даже если задан параметр SO_REUSEADDR.

Исходный номер базы знаний: 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, оно не может работать правильно.

Примечание.

  • По умолчанию Windows Server 2008 R2 не может использовать netsh команду для исключения портов. Однако после применения исправлений 2665809 операционная система поддерживает эту функцию.
  • Эта проблема не возникает в Windows Server 2008 или Windows Server 2003.

Причина

Эта проблема возникает из-за проблемы в драйвере tcpip.sys. В частности, флаг REUSE был перезаписан флагом RESERVED, когда драйвер tcpip.sys привязывает исключенный порт.

Обходное решение

Чтобы обойти эту проблему, воспользуйтесь одним из описанных ниже методов.

  • Используйте порт, который не входит в диапазон динамических портов по умолчанию (от 49 152 до 65 535) и не указывайте порт в качестве исключенного порта, выполнив netsh команду.
  • Используйте функции CreatePersistentTcpPortReservation и LookupPersistentTcpPortReservation для резервирования порта.

Состояние

Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в разделе «Применимо к».

Дополнительная информация

Дополнительные сведения о параметре SO_REUSEADDR см. в функции setsockopt.