次の方法で共有


WPUCompleteOverlappedRequest 関数 (ws2spi.h)

WPUCompleteOverlappedRequest 関数は、重複した I/O 操作に対して重複した I/O 完了通知を実行します。

構文

int WPUCompleteOverlappedRequest(
  [in]  SOCKET          s,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  DWORD           dwError,
  [in]  DWORD           cbTransferred,
  [out] LPINT           lpErrno
);

パラメーター

[in] s

WPUCreateSocketHandle によって作成されたサービス プロバイダー ソケット。

[in] lpOverlapped

完了が通知される重複した I/O 操作に関連付けられている WSAOVERLAPPED 構造体へのポインター。

[in] dwError

完了が通知される重複した I/O 操作の完了状態。

[in] cbTransferred

クライアント バッファーとの間で転送されるバイト数 (転送の方向は、完了が通知される重複した I/O 操作の送信または受信の性質によって異なります)。

[out] lpErrno

この関数の実行に起因するエラー コードへのポインター。

戻り値

エラーが発生しない場合、WPUCompleteOverlappedRequest は 0 を返し、クライアントによって選択されたメカニズムに従って重複した I/O 操作の完了を通知します (lpOverlapped によって参照される WSAOVERLAPPED 構造体で見つかったイベントを通知したり、完了ポートが関連付けられている場合は、完了状態レポートをソケットに関連付けられた完了ポートにキューに入れます)。 それ以外の場合、 WPUCompleteOverlappedRequest はSOCKET_ERRORを返し、 lpErrno で特定のエラー コードを使用できます。

エラー コード 意味
WSAEINVAL
s パラメーターで渡されるソケットは、WPUCreateSocketHandle によって作成されたソケットではありません。

注釈

WPUCompleteOverlappedRequest 関数は、クライアント指定の完了メカニズムがユーザー モード非同期プロシージャ 呼び出し (APC) 以外の操作である重複した I/O 操作に対して、重複した I/O 完了通知を実行します。 この関数は、 WPUCreateSocketHandle によって作成されたソケット ハンドルにのみ使用できます。

**注** この関数は、upcall テーブルを介してアクセスされないという点で、"WPU" プレフィックスを持つ他の関数とは異なります。 代わりに、Ws2_32.dll によって直接エクスポートされます。 この関数を呼び出す必要があるサービス プロバイダーは、WS2_32.lib とリンクするか、 LoadLibraryGetProcAddress などの適切なオペレーティング システム関数を使用して関数ポインターを取得する必要があります。
 
関数 **WPUCompleteOverlappedRequest** は、公開するソケット ハンドルに対してインストール可能なファイル システム (IFS) 機能を直接実装していないサービス プロバイダーによって使用されます。 指定された完了通知がユーザー モード APC 以外の重複した I/O 要求に対して完了通知を実行します。 **WPUCompleteOverlappedRequest** は、 WPUCreateSocketHandle によって作成されたソケット ハンドルに対してのみサポートされ、サービス プロバイダーによって直接作成されたソケットではサポートされません。

クライアントが通知方法としてユーザー モード APC を選択した場合、サービス プロバイダーは WPUQueueApc または別の適切なオペレーティング システム機能を使用して完了通知を実行する必要があります。 ユーザー モード APC がクライアントによって選択されていない場合、IFS 機能を直接実装していないサービス プロバイダーは、クライアントが完了ポートをソケット ハンドルに関連付けているかどうかを判断できません。 したがって、完了通知メソッドが完了状態レコードを完了ポートにキューに入れるか、 WSAOVERLAPPED 構造体で見つかったイベントを通知するかを判断できません。 Windows ソケット 2 アーキテクチャは 、WPUCreateSocketHandle によって作成されたソケットとの完了ポートの関連付けを追跡し、完了ポートベースの通知とイベントベースの通知の間で正しい判断を行うことができます。

WPUCompleteOverlappedRequest が完了通知をキューに入れると、WSAOVERLAPPED 構造体の InternalHigh メンバーが転送されたバイト数に設定されます。 次に、 内部 メンバーを特別な値WSS_OPERATION_IN_PROGRESS以外の OS 依存値に設定します。 WPUCompleteOverlappedRequest が戻ってからこれらの値が表示されるまでに若干の遅延が発生する場合があります。これは、処理が非同期的に行われる可能性があるためです。 ただし、 InternalHigh 値 (バイト数) は、 Internal が設定された時点で確実に設定されます。

WPUCompleteOverlappedRequest は、ソケット ハンドルが完了ポートに関連付けられているかどうかに関係なく、指定されたとおりに機能します (クライアントが要求した完了通知を実行します)。

WSPGetOverlappedResult との対話

WPUCompleteOverlappedRequest の動作では、WSAOVERLAPPED 構造体の Offset メンバーと OffsetHigh メンバーのみがサービス プロバイダーによって排他的に制御されるが、WSPGetOverlappedResult によって構造体から 3 つの値 (バイト数、フラグ、エラー) を取得する必要があるため、サービス プロバイダーが WSPGetOverlappedResult を実装する方法にいくつかの制約があります。 サービス プロバイダーは、 WPUCompleteOverlappedRequest の動作と適切に対話する限り、これを任意の方法で実行できます。 ただし、一般的な実装は次のとおりです。

  • 重複処理の開始時に、サービス プロバイダーは Internal を WSS_OPERATION_IN_PROGRESS に設定します。
  • I/O 操作が完了すると、プロバイダーは OffsetHigh を操作の結果として Windows Socket 2 エラー コードに設定し、 Offset を I/O 操作の結果のフラグに設定し、 WPUCompleteOverlappedRequest を呼び出して転送バイト数をパラメーターの 1 つとして渡します。 WPUCompleteOverlappedRequest は最終的に InternalHigh を転送バイト数に設定し、 Internal をWSS_OPERATION_IN_PROGRESS以外の値に設定します。
  • WSPGetOverlappedResult が呼び出されると、サービス プロバイダーは Internal を確認します。 WSS_OPERATION_IN_PROGRESS場合、プロバイダーは hEvent メンバーのイベント ハンドルを待機するか、 WSPGetOverlappedResult の FWAIT フラグの設定に基づいてエラーを返します。 進行中でない場合、または待機が完了した後、プロバイダーは、転送カウント、操作結果エラー コード、フラグとしてInternalHighOffsetHigh、Offset の値をそれぞれ返します。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー ws2spi.h

こちらもご覧ください

WPUCreateSocketHandle

WPUQueueApc

WSAOVERLAPPED

WSPGetOverlappedResult