記述子の割り当て
Windows ソケット サービス プロバイダーはインストール可能なファイル システム (IFS) オブジェクトとしてソケットを実装することをお勧めしますが、Winsock アーキテクチャでは、ソケット ハンドルが IFS オブジェクトではないサービス プロバイダーにも対応しています。 IFS ハンドルを持つプロバイダーは、 WSAPROTOCOL_INFO構造体の XP1_IFS_HANDLES属性ビットを介してこれを示します。 (注: XP1_IFS_HANDLES属性ビットは、API 仕様のリリース 2.0.8 には含まれていませんでしたが、その後、正誤表メカニズムを通じて追加されています。Winsock SPI クライアントは、ソケット記述子が IFS ハンドルであるプロバイダーを利用できます。これらの記述子は、 ReadFile や WriteFile などの標準の Windows I/O 機能で使用されます。
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 呼び出しを通じていつでもコンテキスト値を取得できるようにします。 このコンテキスト値の一般的な用途は、ソケット状態情報の格納に使用されるサービス プロバイダーの保守データ構造へのポインターを格納することです。