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で特定
エラー コード | 意味 |
---|---|
|
ネットワーク サブシステムが失敗しました。 |
|
指定されたパラメーターのいずれかが無効であることを示します。 |
|
Windows ソケット呼び出しのブロックが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 |
|
これ以上ソケット記述子を使用できません。 |
|
使用できるバッファー領域はありません。 ソケットを作成できません。 |
|
記述子はソケットではありません。 |
備考
ソース プロセス LPWSPDuplicateSocket を呼び出して、特別な WSAPROTOCOL_INFO 構造を取得します。 一部のプロセス間通信 (IPC) メカニズムを使用して、この構造体の内容をターゲット プロセスに渡します。このメカニズムは、LPWSPSocket を
ソース プロセス コンテキストで必要な操作を実行し、ターゲット プロセスのコンテキストで LPWSPSocket を
新しいソケット記述子が割り当てられると、インストール可能なファイル システム (IFS) プロバイダーは WPUModifyIFSHandle
ハンドオフ モードで共有ソケットを確立して使用するシナリオの 1 つを次に示します。
ソース プロセス | IPC | 意味 |
---|---|---|
|
==> | |
|
3) プロセス識別子要求を受信し、応答します。 | |
|
<== | |
|
||
|
||
|
==> | 7) WSAPROTOCOL_INFO 構造を受け取ります。 |
|
8) LPWSPSocket |
|
|
9) データ交換に共有ソケットを使用します。 | |
|
<== |
共有ソケットを参照する記述子は、I/O に関する限り独立して使用できます。 ただし、Windows ソケット インターフェイスはアクセス制御の種類を実装していないため、共有ソケットで操作を調整するプロセスに依存します。 共有ソケットの一般的な用途は、ソケットの作成と接続の確立を担当する 1 つのプロセスを持ち、情報交換を担当する他のプロセスにソケットを渡すことです。
複製されるのはソケット記述子であり、基になるソケットではないため、ソケットに関連付けられているすべての状態は、すべての記述子で共通に保持されます。 たとえば、1 つの記述子を使用して実行された WSPSetSockOpt 操作は、その後、任意またはすべての記述子から LPWSPGetSockopt を使用して表示されます。 プロセスは重複したソケット LPWSPCloseSocket を呼び出すことができるので、記述子の割り当てが解除されます。 ただし、基になるソケットは、LPWSPClosesocket
共有ソケットでの通知には、LPWSPAsyncSelect と LPWSPEventSelect
階層化サービス プロバイダーは、この関数の実装を提供しますが、プロトコル チェーン内の次のレイヤー LPWSPDuplicateSocket を呼び出す場合にも、この関数のクライアントです。 この関数の lpProtocolInfo パラメーターは、プロトコル チェーンのレイヤーを介して伝達されるため、いくつかの特別な考慮事項が適用されます。
プロトコル チェーン内の次のレイヤーが別のレイヤーである場合、次のレイヤーの LPWSPDuplicateSocket が呼び出されると、このレイヤーは、同じ変更されていないチェーン情報を持つ同じ変更されていない WSAPROTOCOL_INFO 構造を参照する lpProtocolInfo を次のレイヤーに渡す必要があります。 ただし、次のレイヤーが基本プロトコル (つまり、チェーン内の最後の要素) である場合、このレイヤーはベース プロバイダーの LPWSPDuplicateSocketを呼び出すときに置換を実行します。 この場合、基本プロバイダーの WSAPROTOCOL_INFO 構造体は、lpProtocolInfo パラメーターによって参照する必要があります。
このポリシーの重要な利点の 1 つは、基本サービス プロバイダーがプロトコル チェーンを認識する必要がないということです。 この同じポリシーは、
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされる最小サーバー | Windows 2000 Server [デスクトップ アプリのみ] |
ヘッダー | ws2spi.h |
関連項目
WPUModifyIFSHandle の