完成数据传输请求

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 请求。