完成数据传输请求

Windows 套接字开关以异步方式在 SAN 套接字上传输数据。 每当交换机调用 SAN 服务提供程序的 WSPSendWSPRecvWSPRdmaWriteWSPRdmaRead 数据传输函数时,它指定指向重叠结构的指针 (WSAOVERLAPPED) ,并为完成例程指定 NULL 。 即使交换机调用 SAN 服务提供程序的 WSPEventSelect 函数来指示套接字处于非阻止模式,SAN 服务提供程序也不需要为这些数据传输函数实现非阻止语义。

Microsoft Windows SDK 文档中的 Windows 套接字 API 和 SPI 文档中所述,阻止和非阻止套接字均将重叠操作视为相同。 也就是说,SAN 服务提供程序启动特定的数据传输操作,然后立即将控制权返回到交换机。 这些数据传输函数返回错误代码WSA_IO_PENDING指示异步操作已启动,该操作稍后完成。 操作完成后,如果交换机需要完成通知,SAN 服务提供商会发出完成信号,如以下段落中所述。

由于开关始终为重叠数据传输操作的完成例程指定 NULL ,因此 SAN 服务提供程序不需要通过使用异步过程调用来支持完成 (APC) 。

只要有可能,交换机会尝试调用 SAN 服务提供程序的 WSPGetOverlappedResult 函数,以轮询数据传输请求的完成情况。 通过这种方式,开关可以避免与活动重叠完成机制相关的开销。 为了向 SAN 服务提供商指示交换机不需要完成通知以执行特定的重叠数据传输操作,交换机将 WSAOVERLAPPED 结构中 hEvent 成员的低序位设置为 1。 SAN 服务提供商不得通知交换机以这种方式提交的请求已完成。

如果开关需要通知重叠的数据传输操作已完成,它将 WSAOVERLAPPED 结构中 hEvent 成员的低序位设置为零。 SAN 服务提供程序必须通过调用 WPUCompleteOverlappedRequest 函数来发出完成信号,完成以这种方式启动的数据传输操作。 在此调用中,SAN 服务提供程序传递指向 WSAOVERLAPPED 结构的指针,该结构对应于已完成的数据传输操作。 在此 WPUCompleteOverlappedRequest 调用中,SAN 服务提供程序还会将调用中从开关获取的套接字描述符传递给 WPUCreateSocketHandle 函数。 开关接收完成通知,将其与应用程序的 I/O 请求匹配,并根据需要为应用程序完成这些 I/O 请求。