Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как решить проблему, из-за которой невозможно снова привязать исключенный порт, даже если задан параметр 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.