接続の開始
Windows ソケット スイッチは、アプリケーションによって開始された WSPConnect 呼び出しを受信すると、接続要求の宛先アドレスと、SAN サービス プロバイダーがサービスを提供するスイッチの IP サブネットのテーブル内のアドレスを比較します。 これらのサブネットの 1 つにこの宛先アドレスが含まれている場合、スイッチは対応する SAN サービス プロバイダーの WSPSocket 関数と WSPBind 関数を呼び出して、「SAN ソケットの作成とバインド」で説明されているように、ソケットを作成およびバインドします。 スイッチは、SAN ソケットを使用して、アプリケーションの接続要求を処理します。 接続要求の宛先アドレスが SAN サブネット上にない場合、または SAN サービス プロバイダーがソケットの作成とバインドに失敗した場合、スイッチは TCP/IP プロバイダーを使用して接続を確立します。
次の図は、Windows ソケット スイッチがリモート ピアとの接続をどのように要求するかに関する概要を示しています。 次のシーケンスとセクションで、接続要求について詳しく説明します。
SAN ソケットを作成してバインドした後、次の手順で説明されているように、スイッチは、SAN ソケットを非ブロッキング モードで使用して接続要求を実行します。
接続要求の実行方法
スイッチは、SAN サービス プロバイダーの WSPEventSelect 関数を呼び出します。 この呼び出しで、スイッチは、FD_CONNECTコードと、そのコードに関連付けられるイベント オブジェクトを渡します。 WSPEventSelect の呼び出しは、接続イベントの通知を要求し、後続の WSPConnect 呼び出しが非ブロッキング モードで実行されることを SAN サービス プロバイダーに通知します。
WSPEventSelect 関数が戻った後、スイッチは SAN サービス プロバイダーの WSPConnect 関数を呼び出します。 この呼び出しでは、スイッチは WSK アドレス ファミリの 1 つの形式で、宛先アドレスを 渡します。 SAN サービス プロバイダーのプロキシ ドライバーは、この宛先アドレスをネイティブ アドレスにマップし、接続の確立を試みます。
SAN サービス プロバイダーの WSPConnect 関数が接続操作をすぐに完了または失敗できる場合は、適切な成功または失敗のコードを返します。 SAN サービス プロバイダーの WSPConnect 関数が、接続要求をすぐに完了できない場合、SAN サービス プロバイダーの接続操作は、別のスレッドで非同期的に続行されます。 SAN サービス プロバイダーの WSPConnect 関数は、ソケットが非ブロッキングとしてマークされ、接続操作をすぐに完了できないことを示す WSAEWOULDBLOCK エラーを返します。
接続操作が完了すると、SAN サービス プロバイダーは Win32 SetEvent 関数を呼び出して、WSPEventSelect 呼び出しで以前に登録されたイベント オブジェクトを通知します。
イベント オブジェクトがシグナリングされると、スイッチは、SAN サービス プロバイダーの WSPEnumNetworkEvents 関数を呼び出して、接続操作の結果を取得します。
注意: スイッチが SAN サービス プロバイダーを介して接続を確立すると、スイッチはその接続に TCP/IP プロバイダーを使用できなくなります。 SAN サービス・プロバイダーは、確立された接続のサービスに必要なすべての機能を、完全に実装する必要があります。
SAN ソケットの破棄
SAN サービス プロバイダーの WSPConnect 関数が失敗した場合、スイッチは、SAN サービス プロバイダーの WSPCloseSocket 関数を呼び出して、SAN ソケットを破棄します。 その後、スイッチは TCP/IP サービス プロバイダーの WSPConnect 関数を呼び出して、接続操作の結果として、SAN サービス プロバイダーから次のいずれかのエラー コードが返されない限り、接続操作を TCP/IP サービス プロバイダーに転送します。
WSAECONNRESET
宛先アドレスで指定されたポートでリッスンするアプリケーションがないことを示します
WSAECONNREFUSED
リモート・アプリケーションが接続要求をアクティブに拒否したことを示します
WSAEHOSTUNREACH
宛先アドレスが存在しないことを示します
これらの先行するエラー コードは、TCP/IP を介した接続の確立の試行も失敗することを保証します。 SAN サービス プロバイダーは、これらのエラー コードのいずれかを保証できない場合、その 1 つを返してはなりません。 たとえば、Windows Sockets Direct をサポートしていないが、NDIS 経由でのみ通信できるターゲット コンピューターが SAN 上に存在する場合、SAN サービス プロバイダーは、TCP/IP プロバイダー経由の接続要求が成功する可能性があるため、このターゲットへの SAN 接続要求が失敗した結果として WSAEHOSTUNREACH を返すことはできません。 この場合、SAN サービス プロバイダーは、WSAETIMEDOUT を返す必要があります。
セッション ネゴシエーション
スイッチが SAN サービス プロバイダー経由で接続を確立した後、スイッチは、SAN サービス プロバイダーの WSPRegisterMemory 拡張関数を呼び出して、受信メッセージを受信するバッファー配列のメモリを事前登録します。 スイッチは、次に、SAN サービス プロバイダーの WSPRecv 関数を呼び出して、リモート ピアから受信メッセージ データを受信する 1 つ以上のバッファーをポストします。 その後、スイッチは、初期フロー制御情報を含むメッセージのペアを交換して、リモート ピアとのセッションをネゴシエートします。 スイッチは、セッションをネゴシエートした後、アプリケーションが開始した WSPConnect 呼び出しを完了します。 その後、アプリケーションは接続でデータの送受信を開始することができます。 詳細については、「接続要求の受け入れ」を参照してください。
SAN ソケット経由で接続が確立された後に、スイッチは、SAN サービス プロバイダーの WSPConnect 関数を呼び出しません。 スイッチは、接続要求をポーリングするスイッチの WSPConnect 関数の呼び出しを開始するアプリケーションを、内部的に処理します。