次の方法で共有


データ転送要求の完了

Windows ソケット スイッチは、SAN ソケット上のデータを非同期的に転送します。 スイッチは、SAN サービス プロバイダーの WSPSendWSPRecvWSPRdmaWrite、または WSPRdmaRead データ転送関数を呼び出すたびに、完了ルーチンの重複した構造 (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 メンバーの下位ビットを 0 に設定します。 SAN サービス プロバイダーは、WPUCompleteOverlappedRequest 関数を呼び出して完了を通知することで、この方法で開始されるデータ転送操作を完了する必要があります。 この呼び出しでは、SAN サービス プロバイダーは、完了したデータ転送操作に対応する WSAOVERLAPPED 構造へのポインターを渡します。 この WPUCompleteOverlappedRequest 呼び出しでは、SAN サービス プロバイダーは、WPUCreateSocketHandle 関数の呼び出しでスイッチから取得されたソケット記述子も渡します。 スイッチは完了通知を受け取り、それらをアプリケーションの I/O 要求に一致させ、必要に応じてそれらの I/O 要求をアプリケーションに対して完了します。