创建和绑定 SAN 套接字

如果 Windows 套接字开关确定它可以通过 SAN 连接而不是 TCP/IP 堆栈路由数据,它将请求相应的 SAN 服务提供程序为可以传输数据的套接字创建、绑定和设置选项。

由 SAN 服务提供程序创建的套接字是 TCP/IP 服务提供程序在应用程序的请求下创建的套接字的 配套 ,该套接字将数据从或传输到该应用程序。 如果 SAN 服务提供程序支持这些选项,则 SAN 服务提供程序创建的 配套 套接字与 TCP/IP 服务提供商创建的套接字具有相同的选项。

配套套接字还具有与 TCP/IP 服务提供程序创建的套接字相同的 IP 地址和 TCP 端口。 SAN 数据通过 SAN 服务提供程序创建的配套套接字而不是 TCP/IP 服务提供程序创建的套接字传输。 SAN 套接字对应用程序不可见。 从应用程序的角度来看,数据是在请求为数据传输创建的套接字上传输的。

注意 交换机始终使用 TCP/IP 服务提供程序通过 原始套接字传输数据。 因此,交换机从不请求 SAN 服务提供程序创建原始套接字。

下图概述了 Windows 套接字开关如何创建配套套接字。 以下各节中的序列更详细地描述了如何创建配套套接字。

显示 Windows 套接字开关如何创建配套套接字的概述的示意图。

启动 TCP/IP 套接字的创建

  1. 在 Windows 套接字交换机收到由应用程序发起的 WSPSocket 调用后,该交换机将调用 TCP/IP 提供程序的 WSPSocket 函数,以请求 TCP/IP 提供程序创建套接字。

  2. Windows 套接字开关将创建的套接字的描述符返回给应用程序,并将此描述符存储在与套接字关联的专用数据结构中。

    从应用程序的角度来看,TCP/IP 提供程序创建的套接字是用于数据传输的套接字,无论交换机是使用 TCP/IP 服务提供程序还是 SAN 服务提供程序来传输数据。

绑定 TCP/IP 套接字

  1. 如果应用程序请求将套接字绑定到特定网络接口控制器 (NIC) 或通配符 IP 地址 (0.0.0.0) ,则交换机将收到 WSPBind 调用。 绑定到通配符 IP 地址的套接字可以侦听来自所有 NIC 的传入连接请求。

    注意 从 Windows Vista 开始,通配符 IP 地址 0.0.0.0 不可用。 同样从 Windows Vista 开始,如果 IPAutoconfigurationEnabled 注册表项设置为值 0,则禁用自动 IP 地址分配,并且不分配 IP 地址。 在这种情况下, ipconfig 命令行工具不会显示 IP 地址。 如果密钥设置为非零值,则会自动分配 IP 地址。 此项可以位于注册表中的以下路径:

    HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\IPAutoconfigurationEnabled

    HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Interfaces\GUID\IPAutoconfigurationEnabled

  2. 交换机通过调用 TCP/IP 提供程序的 WSPBind 函数将此调用转发到 TCP/IP 服务提供程序。

服务提供商确定

  1. 交换机确定在应用程序启动对交换机的 WSPListenWSPConnect 调用后,是否使用 SAN 服务提供程序在套接字上传输数据,如 设置 SAN 连接中所述。

  2. 如果交换机确定它无法使用 SAN 服务提供程序进行数据传输,则交换机将通过 TCP/IP 服务提供程序路由数据传输。

  3. 如果交换机选择 SAN 服务提供程序来为应用程序的套接字提供服务,则交换机会调用 SAN 服务提供商的 WSPSocket 函数来创建配套套接字。

启动配套套接字的创建

  1. SAN 服务提供程序的 WSPSocket 函数初始化一个内部数据结构,在该结构中存储有关配套套接字的信息。

  2. SAN 服务提供商的 WSPSocket 函数接下来必须调用 WPUCreateSocketHandle 函数,以便从交换机获取套接字描述符。

  3. SAN 服务提供程序必须将交换机的套接字描述符存储在配套套接字的内部数据结构中,并且必须为配套套接字返回自己的描述符才能完成 WSPSocket 调用。 SAN 服务提供程序返回的套接字描述符可以是任何有意义的值,例如指向专用数据结构的指针。

  4. 若要对套接字执行操作,交换机会将 SAN 服务提供程序返回的套接字描述符提供给 SAN 服务提供程序的相应功能。 同样,如果 SAN 服务提供商进行以下任一调用,则 SAN 服务提供商必须提供从 WPUCreateSocketHandle 调用中的开关获取的套接字描述符:

    WPUQuerySocketHandleContext

    WPUCloseSocketHandle

    WPUCompleteOverlappedRequest

绑定配套套接字

  1. 如果 SAN 服务提供商的 WSPSocket 函数成功完成,则交换机会立即调用 SAN 服务提供商的 WSPBind 函数,以将本地 IP 地址和 TCP 端口分配给套接字。

  2. 交换机向 SAN 套接字分配与分配给 TCP/IP 提供程序创建的套接字相同的 IP 地址和 TCP 端口。 SAN 服务提供商必须将此 TCP/IP 地址转换为其本机格式。

  3. 交换机提供完全限定的 IP 地址和 TCP 端口 (,即非零值) SAN 服务提供商的 WSPBind 函数,除非应用程序请求侦听来自所有 NIC 的传入连接。 在以后的案例中,开关会将通配符 IP 地址提供给 SAN 服务提供商的 WSPBind 函数。

设置配套套接字的选项

  • 如果应用程序指定了任何套接字选项,则开关将存储这些选项。 创建 SAN 套接字后,交换机为应用程序指定的每个受支持的选项调用 SAN 服务提供程序的 WSPSetSockOpt 函数,以立即为 SAN 套接字设置这些选项。

配套套接字调用失败

  • 如果 SAN 服务提供程序对其 WSPSocket、WSPBindWSPSetSockOpt 函数的任何上述调用失败,则交换机会调用 SAN 服务提供程序的 WSPCloseSocket 函数来销毁 SAN 套接字。 然后,交换机使用 TCP/IP 提供程序继续为应用程序套接字提供服务。 请注意,在交换机使用 SAN 服务提供程序建立连接后,交换机无法使用 TCP/IP 提供程序为应用程序的套接字提供服务。 在这种情况下,开关会将相应的错误返回给应用程序。

连接配套套接字

  • 在交换机设置配套套接字后,交换机为 SAN 服务提供程序调用 WSPListenWSPConnect 函数,以执行导致 SAN 服务提供程序最初设置套接字的操作。 例如,如果应用程序最初请求侦听传入连接,则交换机会调用 SAN 服务提供商的 WSPListen 函数。