完成数据传输请求

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

如 Windows 文档中所述,Microsoft Windows SDK套接字 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 请求。 有关 WPUCompleteOverlappedRequestWPUCreateSocketHandle 函数的信息,请参阅 Windows SDK 文档。