次の方法で共有


LPWSPDUPLICATESOCKET コールバック関数 (ws2spi.h)

LPWSPDuplicateSocket 関数は、共有ソケットの新しいソケット記述子を作成するために使用できる WSAPROTOCOL_INFO 構造体を返します。

構文

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

パラメーター

[in] s

ローカル ソケット記述子。

[in] dwProcessId

共有ソケットが使用されるターゲット プロセスの識別子。

[out] lpProtocolInfo

WSAPROTOCOL_INFO 構造体を格納するのに十分な大きさのクライアントによって割り当てられたバッファーへのポインター。 サービス プロバイダーは、プロトコル情報構造の内容をこのバッファーにコピーします。

[out] lpErrno

エラー コードへのポインター。

戻り値

エラーが発生しない場合、LPWSPDuplicateSocket 0 が返されます。 それ以外の場合は、SOCKET_ERRORの値が返され、lpErrnoで特定 エラー番号を使用できます。

エラー コード 意味
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAEINVAL の
指定されたパラメーターのいずれかが無効であることを示します。
WSAEINPROGRESS を する
Windows ソケット呼び出しのブロックが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEMFILE の
これ以上ソケット記述子を使用できません。
WSAENOBUFS の
使用できるバッファー領域はありません。 ソケットを作成できません。
WSAENOTSOCK の
記述子はソケットではありません。

備考

ソース プロセス LPWSPDuplicateSocket を呼び出して、特別な WSAPROTOCOL_INFO 構造を取得します。 一部のプロセス間通信 (IPC) メカニズムを使用して、この構造体の内容をターゲット プロセスに渡します。このメカニズムは、LPWSPSocket を する呼び出しでそれを使用して、重複したソケットの記述子を取得します。 特殊な WSAPROTOCOL_INFO 構造は、ターゲット プロセスで 1 回だけ使用できることに注意してください。

ソース プロセス コンテキストで必要な操作を実行し、ターゲット プロセスのコンテキストで LPWSPSocket を するためのパラメーターとして認識される WSAPROTOCOL_INFO 構造を作成するのは、サービス プロバイダーの責任です。 その後、プロバイダーは、共通の基になるソケットを参照するソケット記述子を返す必要があります。 WSAPROTOCOL_INFO 構造体の dwProviderReserved メンバーは、サービス プロバイダーで使用でき、重複したハンドルを含む任意の有用なコンテキスト情報を格納するために使用できます。

新しいソケット記述子が割り当てられると、インストール可能なファイル システム (IFS) プロバイダーは WPUModifyIFSHandle呼び出す必要があり、IFS 以外のプロバイダーは WPUCreateSocketHandle呼び出す必要があります。 IFS プロバイダーは、DuplicateHandle 関数を使用できます。 ソケットの重複を適切に実行するには、IFS 以外のサービス プロバイダーが LPWSPDuplicateSocket 関数を使用する必要があります。

ハンドオフ モードで共有ソケットを確立して使用するシナリオの 1 つを次に示します。

ソース プロセス IPC 意味
1) LPWSPSocket, LPWSPConnect
2) ターゲット プロセス識別子を要求します。
==>
3) プロセス識別子要求を受信し、応答します。
4) プロセス識別子を受信します。
<==
5) 特別な WSAPROTOCOL_INFO 構造を取得するために **LPWSPDuplicateSocket** を呼び出します。
6) ターゲットに WSAPROTOCOL_INFO 構造を送信します。
==> 7) WSAPROTOCOL_INFO 構造を受け取ります。
8) LPWSPSocket 呼び出して、共有ソケット記述子を作成します。
9) データ交換に共有ソケットを使用します。
10) LPWSPCloseSocket を する
<==

共有ソケットを参照する記述子は、I/O に関する限り独立して使用できます。 ただし、Windows ソケット インターフェイスはアクセス制御の種類を実装していないため、共有ソケットで操作を調整するプロセスに依存します。 共有ソケットの一般的な用途は、ソケットの作成と接続の確立を担当する 1 つのプロセスを持ち、情報交換を担当する他のプロセスにソケットを渡すことです。

複製されるのはソケット記述子であり、基になるソケットではないため、ソケットに関連付けられているすべての状態は、すべての記述子で共通に保持されます。 たとえば、1 つの記述子を使用して実行された WSPSetSockOpt 操作は、その後、任意またはすべての記述子から LPWSPGetSockopt を使用して表示されます。 プロセスは重複したソケット LPWSPCloseSocket を呼び出すことができるので、記述子の割り当てが解除されます。 ただし、基になるソケットは、LPWSPClosesocket 残りの最後の記述子によって呼び出されるまで開いたままです。

共有ソケットでの通知には、LPWSPAsyncSelect と LPWSPEventSelect通常の制約が適用されます。 共有記述子のいずれかを使用してこれらの呼び出しのいずれかを発行すると、その登録に使用された記述子に関係なく、ソケットの以前のイベント登録が取り消されます。 そのため、たとえば、共有ソケットは、A を処理するFD_READイベントを配信できず、B を処理するイベントFD_WRITE。このような緊密な調整が必要な場合は、開発者が個別のプロセスではなくスレッドを使用することをお勧めします。

階層化サービス プロバイダーは、この関数の実装を提供しますが、プロトコル チェーン内の次のレイヤー LPWSPDuplicateSocket を呼び出す場合にも、この関数のクライアントです。 この関数の lpProtocolInfo パラメーターは、プロトコル チェーンのレイヤーを介して伝達されるため、いくつかの特別な考慮事項が適用されます。

プロトコル チェーン内の次のレイヤーが別のレイヤーである場合、次のレイヤーの LPWSPDuplicateSocket が呼び出されると、このレイヤーは、同じ変更されていないチェーン情報を持つ同じ変更されていない WSAPROTOCOL_INFO 構造を参照する lpProtocolInfo を次のレイヤーに渡す必要があります。 ただし、次のレイヤーが基本プロトコル (つまり、チェーン内の最後の要素) である場合、このレイヤーはベース プロバイダーの LPWSPDuplicateSocketを呼び出すときに置換を実行します。 この場合、基本プロバイダーの WSAPROTOCOL_INFO 構造体は、lpProtocolInfo パラメーターによって参照する必要があります。

このポリシーの重要な利点の 1 つは、基本サービス プロバイダーがプロトコル チェーンを認識する必要がないということです。 この同じポリシーは、LPWSPAddressToStringWSPStartup、LPWSPSocket、または LPWSPStringToAddressなど、他の関数の階層化されたシーケンスを介して WSAPROTOCOL_INFO 構造体を伝達する場合にも適用されます。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされる最小サーバー Windows 2000 Server [デスクトップ アプリのみ]
ヘッダー ws2spi.h

関連項目

WPUCreateSocketHandle

WPUModifyIFSHandle の