LPFN_RIODEQUEUECOMPLETION コールバック関数 (mswsock.h)

RIODequeueCompletion 関数は、Winsock に登録されている I/O 拡張機能で使用するために、I/O 完了キューからエントリを削除します。

構文

LPFN_RIODEQUEUECOMPLETION LpfnRiodequeuecompletion;

ULONG LpfnRiodequeuecompletion(
  RIO_CQ CQ,
  PRIORESULT Array,
  ULONG ArraySize
)
{...}

パラメーター

CQ

I/O 完了キューを識別する記述子。

Array

デキューされた完了の説明を受け取る RIORESULT 構造体の配列。

ArraySize

書き込む 配列 内のエントリの最大数。

戻り値

エラーが発生しない場合、 RIODequeueCompletion 関数は、指定された完了キューから削除された完了エントリの数を返します。 それ以外の場合は、メモリの破損または RIO 関数の誤用により、CQ パラメーターで渡されたRIO_CQの状態が破損していることを示すために、RIO_CORRUPT_CQの値が返されます。

注釈

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 構造体) へのアクセスは、同期プリミティブによって保護されません。 複数のスレッドから完了キューまたは要求キューにアクセスする必要がある場合は、クリティカル セクション、スリム リーダー書き込みロック、または同様のメカニズムによってアクセスを調整する必要があります。 このロックは、1 つのスレッドによるアクセスには必要ありません。 異なるスレッドは、ロックなしで個別の要求/完了キューにアクセスできます。 同期の必要性は、複数のスレッドが同じキューにアクセスしようとした場合にのみ発生します。 また、送信操作と受信操作でソケットの要求キューが使用されるため、複数のスレッドの問題が同じソケットで送受信される場合も、同期が必要です。

 

注意

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.1Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

スレッド セーフ

RIODequeueCompletion 関数を使用して複数のスレッドが同じRIO_CQにアクセスしようとする場合は、クリティカル セクション、スリム リーダー ライター ロック、または同様の相互除外メカニズムによってアクセスを調整する必要があります。 完了キューが共有されていない場合、相互除外は必要ありません。

要件

要件
Header mswsock.h