LPFN_RIODEQUEUECOMPLETION
コールバックシグネチャ
DWORD LPFN_RIODEQUEUECOMPLETION(
RIO_CQ CQ,
RIORESULT* Array,
DWORD ArraySize
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| CQ | RIO_CQ | I/O 完了キューを識別する記述子です。 |
| Array | RIORESULT* | デキューされた完了の情報を受け取る RIORESULT 構造体の配列です。 |
| ArraySize | DWORD | Array に書き込むエントリの最大数です。 |
公式ドキュメント
RIODequeueCompletion 関数は、Winsock 登録済み I/O 拡張で使用する I/O 完了キューからエントリを削除します。
戻り値
エラーが発生しなかった場合、RIODequeueCompletion 関数は、指定された完了キューから削除された完了エントリの数を返します。それ以外の場合は RIO_CORRUPT_CQ が返され、CQ パラメーターに渡された RIO_CQ の状態が、メモリ破損または RIO 関数の誤用によって破損していることを示します。
解説(Remarks)
RIODequeueCompletion 関数は、Winsock 登録済み I/O 拡張による送信要求および受信要求について、I/O 完了キューからエントリを削除します。
RIODequeueCompletion 関数は、アプリケーションが完了した送信要求および受信要求を知るための仕組みです。通常、アプリケーションは、完了キューが空でないときに RIONotify 関数で登録された方法に基づく通知を受け取った後で、RIODequeueCompletion 関数を呼び出します。I/O 完了キューの通知動作は、RIO_CQ の作成時に設定されます。通知動作を決定する RIO_NOTIFICATION_COMPLETION 構造体は、RIO_CQ の作成時に RIOCreateCompletionQueue 関数に渡されます。
RIODequeueCompletion 関数が完了すると、Array パラメーターには、デキューされた完了済みの送信要求および受信要求に対応する RIORESULT 構造体へのポインターの配列が格納されます。返される RIORESULT 構造体のメンバーは、完了した要求の完了状態と転送されたバイト数に関する情報を提供します。返される各 RIORESULT 構造体には、完了した特定の要求を識別するために使用できるソケットコンテキストとアプリケーションコンテキストも含まれます。
CQ パラメーターに渡された I/O 完了キューが有効でない場合、または破損している場合、RIODequeueCompletion 関数は RIO_CORRUPT_CQ というカウントを返します。
デキューする完了済みの送信要求または受信要求がない場合、RIODequeueCompletion 関数は 0 を返します。
要求の完了がデキューされて初めて、システムはそのバッファーおよびバッファー登録との関連付けを、クォータの割り当て分とともに解放します。
効率のため、完了キュー (RIO_CQ 構造体) および要求キュー (RIO_RQ 構造体) へのアクセスは、同期プリミティブによって保護されていません。複数のスレッドから完了キューまたは要求キューにアクセスする必要がある場合は、クリティカルセクション、スリムリーダーライターロック、または同様の機構によってアクセスを調整してください。単一のスレッドからのアクセスでは、このロックは不要です。異なるスレッドがそれぞれ別の要求キュー/完了キューにアクセスする場合は、ロックなしでアクセスできます。同期が必要になるのは、複数のスレッドが同じキューにアクセスしようとする場合のみです。また、複数のスレッドが同じソケットで送信および受信を発行する場合も、送信操作と受信操作はそのソケットの要求キューを使用するため、同期が必要です。
RIODequeueCompletion 関数への関数ポインターは、SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER オペコードを指定して WSAIoctl 関数を呼び出すことにより、実行時に取得する必要があります。WSAIoctl 関数に渡す入力バッファーには、Winsock 登録済み I/O 拡張関数を識別する値を持つグローバル一意識別子 (GUID) である WSAID_MULTIPLE_RIO を格納する必要があります。成功した場合、WSAIoctl 関数が返す出力には、Winsock 登録済み I/O 拡張関数へのポインターを含む RIO_EXTENSION_FUNCTION_TABLE 構造体へのポインターが格納されます。SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL は Ws2def.h ヘッダーファイルで定義されています。WSAID_MULTIPLE_RIO GUID は Mswsock.h ヘッダーファイルで定義されています。
Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストアアプリでサポートされます。
Windows 8.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストアアプリでサポートされます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)