SO_PORT_SCALABILITY

SO_PORT_SCALABILITY套接字选项支持套接字的本地端口可伸缩性。

SO_PORT_SCALABILITY

0x3006

SO_PORT_SCALABILITY套接字选项允许通过多次为本地计算机上的不同本地地址端口对分配通配符端口来最大化端口分配,从而实现本地端口可伸缩性。

备注

注意:在同时支持SO_PORT_SCALABILITY和SO_REUSE_UNICASTPORT的平台上,首选使用 SO_REUSE_UNICASTPORT。

由于本地端口可用性有限,代理服务器环境存在可伸缩性问题。 解决此问题的一种方法是向计算机添加更多 IP 地址。 但是,默认情况下,与 绑定 函数一起使用的通配符端口限制为本地计算机上的动态端口范围的大小, (最多 64K 个端口,但通常) 无论本地计算机上的 IP 地址数如何。 解决此问题需要应用程序使用端口预留或使用启发法维护自己的端口池。

为了避免每个需要可伸缩性的应用程序都管理自己的端口池,并允许在保持应用程序兼容性的同时提高可伸缩性,Windows Server 2008 引入了 SO_PORT_SCALABILITY 套接字选项,以帮助最大程度地分配通配符端口。 允许应用程序为每个唯一的本地地址和端口对分配通配符端口来最大化端口分配。 因此,如果本地计算机有 4 个 IP 地址,则最多可以通过通配符 绑定 函数请求分配 256 K 个通配符端口 (64 K 个端口) × 4 个 IP 地址。

在套接字上设置了 SO_PORT_SCALABILITY 套接字选项,并且对指定地址和通配符端口调用 绑定 函数时, (使用特定地址和端口 0) 设置 name 参数时,Winsock 将为指定地址分配端口。 此分配将基于本地计算机上所有可能的 IP 地址和端口/每个地址。 如果使用 SO_PORT_SCALABILITY 选项获取通配符端口,则没有 SO_PORT_SCALABILITY 选项的其他套接字无法分配该端口。 此限制是为了避免应用程序后向兼容性问题,这些应用程序假定不能重复使用通配符本地端口。 请注意,这意味着使用 SO_PORT_SCALABILITY 获取大量端口的应用程序可能会耗尽旧版端口应用程序。 如果已为至少一个具有 SO_PORT_SCALABILITY 的地址获取了所有可用的临时端口,则如果没有套接字选项,将无法再进行通配符端口分配。

若要产生任何效果,必须在调用绑定函数之前设置SO_PORT_SCALABILITY选项。 下面概述了如何在具有两个地址的计算机上使用此方法的示例:

  • 套接字函数由进程调用以创建套接字。
  • 调用 setsockopt 函数以在新创建的套接字上启用 SO_PORT_SCALABILITY 套接字选项。
  • 调用 绑定 函数以在本地计算机的 IP 地址和端口 0 之一上进行绑定。
  • 然后调用 connect 函数以连接到远程 IP 地址。 应用程序根据需要使用套接字。
  • 套接字函数由同一进程调用, (不同的线程) 创建另一个套接字。
  • 调用 setsockopt 函数以在新创建的第二个套接字上启用 SO_PORT_SCALABILITY 套接字选项。
  • 绑定函数使用本地计算机的第二个 IP 地址和端口 0 调用。 即使之前已分配所有端口,此调用也会成功,因为本地计算机上有多个 IP 地址可用,并且在同一进程中的两个套接字上设置了 SO_PORT_SCALABILITY 套接字选项。
  • 然后调用 connect 函数以连接到远程 IP 地址。 应用程序根据需要使用第二个套接字。

要求

要求
最低受支持的客户端
无受支持的版本
最低受支持的服务器
Windows Server 2008 [仅限桌面应用]
标头
Ws2def.h

另请参阅

getsockopt

setsockopt

SOL_SOCKET套接字选项

套接字选项