次の方法で共有


記述子の割り当て

Windows ソケット サービス プロバイダーは、インストール可能なファイル システム (IFS) オブジェクトとしてソケットを実装することをお勧めしますが、Winsock アーキテクチャでは、ソケット ハンドルが IFS オブジェクトではないサービス プロバイダーにも対応しています。 IFS ハンドルを持つプロバイダーは、WSAPROTOCOL_INFO 構造体のXP1_IFS_HANDLES属性ビットを介してこれを示します。 (注: XP1_IFS_HANDLES属性ビットは、API 仕様のリリース 2.0.8 には含まれていませんが、その後、errata メカニズムを介して追加されています)。Winsock SPI クライアントは、ReadFile や WriteFile など、標準の Windows I/O 機能を備えたこれらの記述子を使用して、ソケット記述子が IFS ハンドルであるプロバイダー利用できます。

IFS プロバイダーが新しいソケット記述子を作成するたびに、Windows ソケット SPI クライアントに新しいハンドルを提供する前に、プロバイダーが WPUModifyIFSHandle呼び出す必要があります。 この関数は、プロバイダー識別子と提案された IFS ハンドルを入力としてプロバイダーから受け取り、(場合によっては) 変更されたハンドルを返します。 IFS プロバイダーは、変更されたハンドルのみをクライアントに提供する必要があり、クライアントからのすべての要求は、この変更されたハンドルのみを参照します。 変更されたハンドルは、オペレーティング システムに関する限り、提案されたハンドルと区別できないことが保証されます。 したがって、ほとんどの場合、サービス プロバイダーは、すべての内部処理で変更されたハンドルのみを使用することを選択します。 この変更関数の目的は、Ws2_32.dll が特定のソケットに関連付けられているサービス プロバイダーを識別するプロセスを大幅に合理化できるようにすることです。

IFS ハンドルを返さないプロバイダーは、WPUCreateSocketHandle 呼び出しを介して、Ws2_32.dll から有効なハンドルを取得する必要があります。 非IFS プロバイダーは、Windows ソケット 2.DLL提供されるハンドルのみをクライアントに提供する必要があり、クライアントからの要求はすべて、これらのハンドルのみを参照します。 サービス プロバイダーの実装者の便宜上、WPUCreateSocketHandle のプロバイダーによって提供される入力パラメーターの 1 つは DWORD コンテキスト値です。 Ws2_32.dll は、このコンテキスト値を割り当てられたソケット ハンドルに関連付け、サービス プロバイダーが WPUQuerySocketHandleContext 呼び出しを通じていつでもコンテキスト値を取得できるようにします。 このコンテキスト値の一般的な用途は、ソケットの状態情報を格納するために使用されるサービス プロバイダーが管理するデータ構造へのポインターを格納することです。