SPI の共有ソケット
Windows ソケット内のプロセス間のソケット共有は、次のように実装されます。 ソース プロセスは WSPDuplicateSocket を呼び出して、特別な WSAPROTOCOL_INFO 構造体を取得します。 一部のプロセス間通信 (IPC) メカニズムを使用して、この構造体の内容をターゲット プロセスに渡します。 次に、ターゲット プロセスは WSPSocket の呼び出しでWSAPROTOCOL_INFO構造体を使用します。 この関数によって返されるソケット記述子は、基になるソケットに対する追加のソケット記述子になり、それによって共有されます。
ソース プロセス コンテキストで必要な操作を実行し、その後ターゲット プロセスのコンテキストで WSPSocket のパラメーターとして表示されたときに認識されるWSAPROTOCOL_INFO構造を作成するのは、サービス プロバイダーの責任です。 WSAPROTOCOL_INFO構造体の dwProviderReserved メンバーは、サービス プロバイダーが使用するために使用でき、重複したハンドルを含む任意の有用なコンテキスト情報を格納するために使用できます。
このメカニズムは、シングル スレッドバージョンとプリエンプティブ マルチスレッド バージョンの両方の Windows に適するように設計されています。 ただし、ソケット記述子はプロセスのすべてのスレッドで有効であるため、 WSPDuplicateSocket 関数を使用せずに、特定のプロセス内のスレッド間でソケットを共有できます。
「 記述子の割り当て」で説明されているように、新しいソケット記述子が割り当てられると、IFS プロバイダーは WPUModifyIFSHandle を呼び出す必要があり、IFS 以外のプロバイダーは WPUCreateSocketHandle を呼び出す必要があります。
ハンドオフ モードで共有ソケットを確立して使用するシナリオの 1 つを次の表に示します。
Source process (依存元プロセス) | IPC | Destination process (依存先プロセス) |
---|---|---|
1) WSPSocket、 WSPConnect | ||
2) ターゲット プロセス識別子を要求します。 | ==> | |
3) プロセス識別子要求を受信し、応答します。 | ||
4) プロセス識別子を受信します。 | <== | |
5) WSPDuplicateSocket を呼び出して、特別な WSAPROTOCOL_INFO 構造を取得します。 | ||
6) WSAPROTOCOL_INFO 構造体をターゲットに送信します。 | ||
==> | 7) WSAPROTOCOL_INFO 構造を受け取ります。 | |
8) WSPSocket を呼び出して、共有ソケット記述子を作成します。 | ||
9)データ交換に共有ソケットを使用します。 | ||
10) WSPClosesocket | <== |