SAN の呼び出しのブロック
Windows ソケット スイッチは、ブロック呼び出しとそのような呼び出しの取り消しを内部的に処理するか、TCP/IP サービス プロバイダーに転送します。 スイッチは、進行中のブロック要求を取り消すために、SAN サービス プロバイダーの WSPCancelBlockingCall 関数を呼び出すことはありません。 そのため、SAN サービス プロバイダーは、WSPCancelBlockingCall 関数を実装する必要はありません。
スイッチは、次のブロック要求と対応するキャンセルを次の方法で処理します。
アプリケーションがブロック モードで SAN ソケットを特定の宛先アドレスに接続するように要求すると、スイッチはブロック WSPConnect 呼び出しを受け取ります。 スイッチは、非ブロック モードの接続要求を適切な SAN サービス プロバイダーの WSPConnect 関数に転送します。 何らかの理由でこの接続要求を取り消す必要がある場合、スイッチは SAN サービス プロバイダーの WSPCloseSocket 関数を呼び出します。 SAN サービス プロバイダーは、接続要求を直ちに中止し、ソケットのリソースを解放する必要があります。
スイッチは、SAN ソケットでデータ転送操作を実行するためにアプリケーションによって開始されたブロック要求を受信すると、重複した (非ブロック) 方法でデータ転送要求を適切な SAN サービス プロバイダーに転送します。 たとえば、スイッチが同期 (ブロック) WSPSend 呼び出しを受け取った場合、適切な SAN サービス プロバイダーの WSPSend 関数を重複 (非ブロッキング) 方式で呼び出します。 アプリケーションが後でデータ転送操作を取り消し、スイッチがアプリケーションのバッファーを制御している場合、スイッチは障害状態でアプリケーションの要求を完了します。 アプリケーションのバッファーが未処理の RDMA 操作に関係している場合、スイッチは操作の完了を待機します。 RDMA 転送の完了に時間がかかりすぎる場合、スイッチは適切な SAN サービス プロバイダーの WSPCloseSocket 関数を呼び出して、中止的な方法で接続を閉じ、完了を強制します。
注: ブロック呼び出しを取り消したアプリケーションは、保持されている接続に依存できません。 ブロック要求の取り消し後にソケットで成功することが保証されるのは、WSPCloseSocket 呼び出しだけです。 詳細については、Microsoft Windows SDK の「Windows ソケット SPI」ドキュメントを参照してください。