次の方法で共有


SAN ソケットの作成とバインド

Windows ソケット スイッチは、TCP/IP スタック経由ではなく SAN 接続を介してデータをルーティングできることを判断した場合、適切な SAN サービス プロバイダーに対して、データを転送できるソケットの作成、バインド、および設定オプションを要求します。

SAN サービス プロバイダーによって作成されたソケットは、 TCP/IP サービス プロバイダーがアプリケーションの要求時に作成した、データの転送元または転送先のソケットのコンパニオン です。 SAN サービス プロバイダーがこれらのオプションをサポートしている場合、SAN サービス プロバイダーによって作成されたコンパニオン ソケットには、TCP/IP サービス プロバイダーによって作成されたソケットと同じオプションがあります。

また、コンパニオン ソケットは、TCP/IP サービス プロバイダーによって作成されたソケットと同じ IP アドレスと TCP ポートを持ちます。 SAN データは、TCP/IP サービス・プロバイダーが作成したソケットではなく、SAN サービス・プロバイダーが作成したコンパニオン・ソケットを介して転送されます。 SAN ソケットはアプリケーションからは見えません。 アプリケーションの観点からは、データ転送用に作成を要求したソケットでデータが転送されます。

注: スイッチは常に TCP/IP サービス プロバイダーを使用して、生のソケット経由で データを転送します。 したがって、スイッチは SAN サービス プロバイダーに raw ソケットの作成を要求しません。

次の図は、Windows ソケット スイッチがコンパニオン ソケットを作成する方法の概要を示しています。 次のセクションのシーケンスでは、コンパニオン ソケットの作成について詳しく説明します。

Diagram that shows an overview of how the Windows Sockets switch creates a companion socket.

TCP/IP ソケットの作成の開始

  1. Windows ソケット スイッチは、アプリケーションによって開始された WSPSocket 呼び出しを受け取った後、TCP/IP プロバイダーの WSPSocket 関数を呼び出して、TCP/IP プロバイダーにソケットの作成を要求します。

  2. Windows ソケット スイッチは、作成されたソケットの記述子をアプリケーションに返し、ソケットに関連付けられているプライベート データ構造にこの記述子を格納します。

    アプリケーションの観点から見ると、スイッチが TCP/IP サービス プロバイダーと SAN サービス プロバイダーのどちらを使用してデータを転送するかに関係なく、TCP/IP プロバイダーによって作成されたソケットは、データ転送に使用されるソケットです。

TCP/IP ソケットのバインド

  1. アプリケーションがソケットを特定のネットワーク インターフェイス コントローラー (NIC) または野生カード IP アドレス (0.0.0.0) にバインドするように要求した場合、スイッチは WSPBind 呼び出しを受け取ります。 野生の IP アドレスにバインドされたソケットカードは、すべての NIC からの着信接続要求をリッスンできます。

    注: Windows Vista 以降では、ワイルドカード IP アドレス 0.0.0.0 は使用できません。 また、Windows Vista 以降では、IPAutoconfigurationEnabled レジストリ キーの値が 0 に設定されている場合、IP アドレスの自動割り当ては無効になり、IP アドレスは割り当てられません。 この場合、ipconfig コマンド ライン ツールは IP アドレスを表示しません。 キーが 0 以外の値に設定されている場合は、IP アドレスが自動的に割り当てられます。 このキーは、レジストリ内の次のパスに配置できます。

    HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\IPAutoconfigurationEnabled

    HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Interfaces\GUID\IPAutoconfigurationEnabled

  2. スイッチは、TCP/IP プロバイダーの WSPBind 関数を呼び出すことによって、この呼び出しを TCP/IP サービス プロバイダーに転送します。

サービス プロバイダーの決定

  1. スイッチは、「SAN 接続のセットアップ」の説明に従って、アプリケーションがスイッチへの WSPListen または WSPConnect 呼び出しを開始した後に、ソケットでのデータ転送に SAN サービス プロバイダーを使用するかどうかを決定します。

  2. スイッチは、データ転送に SAN サービス プロバイダーを使用できないと判断した場合、TCP/IP サービス プロバイダーを介してデータ転送をルーティングします。

  3. スイッチがアプリケーションのソケットにサービスを提供する SAN サービス プロバイダーを選択した場合、スイッチは SAN サービス プロバイダーの WSPSocket 関数を呼び出してコンパニオン ソケットを作成します。

コンパニオンソケットの作成の開始

  1. SAN サービス プロバイダーの WSPSocket 関数は、コンパニオン ソケットに関する情報を格納する内部データ構造を初期化します。

  2. SAN サービス プロバイダーの WSPSocket 関数は、次に WPUCreateSocketHandle 関数を呼び出して、スイッチからソケット記述子を取得する必要があります。

  3. SAN サービス プロバイダーは、受け入れソケットの内部データ構造にスイッチの記述子を格納し、WSPAccept 呼び出しを完了するために受け入れソケット用の独自の記述子を返す必要があります。 SAN サービス プロバイダーによって返されるソケット記述子には、プライベート データ構造へのポインターなど、意味のある任意の値を指定できます。

  4. ソケットに対して操作を実行するために、スイッチは、SAN サービス プロバイダーから返されたソケット記述子を SAN サービス プロバイダーの適切な機能に提供します。 同様に、SAN サービス プロバイダーは、SAN サービス プロバイダーが次のいずれかの呼び出しを行う場合、WPUCreateSocketHandle 呼び出しでスイッチから取得されたソケット記述子を提供する必要があります。

    WPUQuerySocketHandleContext

    WPUCloseSocketHandle

    WPUCompleteOverlappedRequest

コンパニオン ソケットのバインド

  1. SAN サービス プロバイダーの WSPSocket 関数が正常に完了した場合、スイッチはすぐに SAN サービス プロバイダーの WSPBind 関数を呼び出して、ローカル IP アドレスと TCP ポートをソケットに割り当てます。

  2. スイッチは、TCP/IP プロバイダーによって作成されたソケットに割り当てられたのと同じ IP アドレスと TCP ポートを SAN ソケットに割り当てます。 SAN サービス プロバイダーは、この TCP/IP アドレスをネイティブ形式に変換する必要があります。

  3. スイッチは、アプリケーションがすべての NIC からの着信接続をリッスンするように要求しない限り、SAN サービス プロバイダーの WSPBind 関数に完全修飾 IP アドレスと TCP ポート (つまり、0 以外の値) を提供します。 以降の場合、スイッチは、SAN サービス プロバイダーの WSPBind 関数に野生のカード IP アドレスを提供します。

コンパニオンソケットのオプションの設定

  • アプリケーションがソケット オプションを指定した場合、スイッチはそれらのオプションを格納します。 SAN ソケットを作成した後、スイッチは、アプリケーションで指定されたサポートされている各オプションに対して SAN サービス プロバイダーの WSPSetSockOpt 関数を呼び出して、SAN ソケットに対してこれらのオプションをすぐに設定します。

コンパニオン ソケット呼び出しの失敗

  • SAN サービス プロバイダーが、前述の WSPSocketWSPBind、または WSPSetSockOpt 関数の呼び出しに失敗した場合、スイッチは SAN サービス プロバイダーのWSPCloseSocket 関数を呼び出して SAN ソケットを破棄します。 その後、スイッチは TCP/IP プロバイダーを使用して、アプリケーション ソケットのサービスを継続します。 スイッチが SAN サービス プロバイダーを使用して接続を確立した後、スイッチは TCP/IP プロバイダーを使用してアプリケーションのソケットにサービスを提供できないことに注意してください。 この場合、スイッチはアプリケーションに適切なエラーを返します。

コンパニオン ソケットの接続

  • スイッチがコンパニオン ソケットを設定した後、スイッチは SAN サービス プロバイダーの WSPListen または WSPConnect 関数を呼び出して、SAN サービス プロバイダーが最初にソケットを設定する原因となった操作を実行します。 たとえば、アプリケーションが最初に受信接続のリッスンを要求した場合、スイッチは SAN サービス プロバイダーの WSPListen 関数を呼び出します。