Win32 API 日本語リファレンス
ホーム › Networking.WinSock › LPWPUCOMPLETEOVERLAPPEDREQUEST

LPWPUCOMPLETEOVERLAPPEDREQUEST

コールバック

シグネチャ

INT LPWPUCOMPLETEOVERLAPPEDREQUEST(
    SOCKET s,
    OVERLAPPED* lpOverlapped,
    DWORD dwError,
    DWORD cbTransferred,
    INT* lpErrno
);

パラメーター

フィールド型説明
sSOCKETWPUCreateSocketHandle によって作成された、サービスプロバイダーのソケットです。
lpOverlappedOVERLAPPED*完了を通知する対象のオーバーラップ I/O 操作に関連付けられた WSAOVERLAPPED 構造体へのポインターです。
dwErrorDWORD完了を通知する対象のオーバーラップ I/O 操作の完了ステータスです。
cbTransferredDWORDクライアントのバッファーとの間で転送されたバイト数です(転送の方向は、完了を通知する対象のオーバーラップ I/O 操作が送信と受信のどちらであるかによって決まります)。
lpErrnoINT*この関数の実行によって生じたエラーコードへのポインターです。

公式ドキュメント

WPUCompleteOverlappedRequest 関数は、オーバーラップ I/O 操作に対して、オーバーラップ I/O の完了通知を行います。

戻り値

エラーが発生しなかった場合、 WPUCompleteOverlappedRequest は 0 を返し、クライアントが選択したメカニズムに従ってオーバーラップ I/O 操作の完了を通知します(lpOverlapped が参照する WSAOVERLAPPED 構造体内のイベントをシグナル状態にする、または、ソケットに完了ポートが関連付けられている場合は、その完了ポートに完了ステータスのレポートをキューイングします。あるいはその両方を行います)。それ以外の場合、 WPUCompleteOverlappedRequest は SOCKET_ERROR を返し、具体的なエラーコードは lpErrno で取得できます。

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

解説(Remarks)

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

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

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

WPUCompleteOverlappedRequest は、完了の通知をキューイングする際に、 WSAOVERLAPPED 構造体の InternalHigh メンバーに転送されたバイト数を設定します。次に、Internal メンバーに、特別な値である WSS_OPERATION_IN_PROGRESS 以外の OS 依存の値を設定します。処理が非同期に行われる場合があるため、 WPUCompleteOverlappedRequest が制御を返してからこれらの値が反映されるまでに、わずかな遅延が生じることがあります。ただし、Internal が設定される時点までに InternalHigh の値(バイト数)が設定されていることは保証されます。

WPUCompleteOverlappedRequest は、ソケットハンドルに完了ポートが関連付けられているかどうかにかかわらず、前述のとおりに動作します(クライアントが要求したとおりに完了通知を行います)。

WSPGetOverlappedResult との相互作用

WPUCompleteOverlappedRequest の動作は、サービスプロバイダーが WSPGetOverlappedResult をどのように実装するかに、いくつかの制約を課します。というのも、 WSAOVERLAPPED 構造体のうちサービスプロバイダーが排他的に制御できるのは Offset メンバーと OffsetHigh メンバーだけであるにもかかわらず、 WSPGetOverlappedResult は 3 つの値(バイト数、フラグ、エラー)をこの構造体から取得しなければならないためです。サービスプロバイダーは、 WPUCompleteOverlappedRequest の動作と適切に連携する限り、任意の方法でこれを実現できます。ただし、一般的な実装は次のとおりです。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)