本文提供了帮助来解决无法再次绑定排除端口的问题,即使设置了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 中调用两个绑定的应用程序,则它无法正常工作。
注意
- 默认情况下,Windows Server 2008 R2 无法使用
netsh命令排除端口。 但是,在应用 修补程序2665809后,操作系统支持此函数。 - 此问题不会出现在 Windows Server 2008 或 Windows Server 2003 中。
原因
此问题因tcpip.sys驱动程序中的问题而发生。 具体而言,当tcpip.sys驱动程序绑定排除端口时,RESERVED 标志将覆盖 REUSE 标志。
解决方法
若要解决此问题,请使用以下某种方法:
- 使用默认动态端口范围(从 49,152 到 65,535)中包含的端口,并且不通过运行以下命令
netsh将端口指定为排除端口。 - 使用 CreatePersistentTcpPortReservation 和 LookupPersistentTcpPortReservation 函数保留端口。
Status
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。
详细信息
请参阅 setsockopt 函数,详细了解SO_REUSEADDR选项。