阻止调用 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 文档。