阻止调用 SAN

Windows 套接字开关在内部处理阻止调用和取消此类调用,或将其转发到 TCP/IP 服务提供程序。 该开关从不调用 SAN 服务提供商的 WSPCancelBlockingCall 函数来取消正在进行的阻止请求。 因此,实现 WSPCancelBlockingCall 函数不需要 SAN 服务提供商。

开关通过以下方式处理以下阻止请求和相应的取消:

  • 当应用程序请求在阻止模式下将 SAN 套接字连接到特定目标地址时,交换机将收到阻止 WSPConnect 调用。 交换机在非阻止模式下将连接请求转发到相应的 SAN 服务提供商的 WSPConnect 函数。 如果交换机出于某种原因必须取消此连接请求,它将调用 SAN 服务提供商的 WSPCloseSocket 函数。 SAN 服务提供程序必须立即中止连接请求并释放套接字的资源。

  • 当交换机收到应用程序为在 SAN 套接字上执行数据传输操作而发起的阻止请求时,它会以重叠 (非阻止) 方式将数据传输请求转发到相应的 SAN 服务提供商。 例如,如果交换机收到同步 (阻止) WSPSend 调用,它将以重叠 (非阻止) 方式调用相应 SAN 服务提供商的 WSPSend 函数。 如果应用程序稍后取消了数据传输操作,并且交换机控制了应用程序的缓冲区,则交换机会以失败状态完成应用程序的请求。 如果未完成的 RDMA 操作涉及应用程序的缓冲区,则开关将等待操作完成。 如果 RDMA 传输需要很长时间才能完成,则交换机会调用相应的 SAN 服务提供商的 WSPCloseSocket 函数,以中止方式关闭连接,从而强制完成。

注意 如果应用程序取消阻止调用,则它不能依赖于正在保留的连接。 只有 WSPCloseSocket 调用保证在阻止请求取消后在套接字上成功。 有关详细信息,请参阅Microsoft Windows SDK中的 Windows 套接字 SPI 文档。