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