LPFN_RIONOTIFY コールバック関数 (mswsock.h)
RIONotify 関数は、Winsock に登録された I/O 拡張機能で使用するために、通知動作に使用するメソッドを I/O 完了キューに登録します。
構文
LPFN_RIONOTIFY LpfnRionotify;
INT LpfnRionotify(
RIO_CQ CQ
)
{...}
パラメーター
CQ
I/O 完了キューを識別する記述子。
戻り値
エラーが発生しない場合、 RIONotify 関数は ERROR_SUCCESSを返します。 それ以外の場合、関数は失敗し、特定のエラー コードが返されます。
リターン コード | 説明 |
---|---|
無効なパラメーターが関数に渡されました。 このエラーは、無効な完了キューが CQ パラメーターで渡された場合に返されます (たとえば、RIO_INVALID_CQ)。 このエラーは、内部エラーが発生したときにも返すことができます。 |
|
既に操作が進行中のブロック不可のソケットに対して、操作を実行しようとしました。 このエラーは、以前の RIONotify 要求がまだ完了していない場合に返されます。 |
注釈
RIONotify 関数は、ネットワーク データを送受信するための通知動作に使用するメソッドを Winsock に登録された I/O 拡張機能に登録します。
RIONotify 関数は、要求が完了し、RIODequeueCompletion 関数の呼び出しを待機していることをアプリケーションが検出するメカニズムです。 RIONotify 関数は、I/O 完了キューが空ではなく、結果の完了が含まれている場合の通知動作に使用するメソッドを設定します。
完了キューの通知動作は、 RIO_CQ の作成時に設定されます。 RIO_NOTIFICATION_COMPLETION構造体は、RIO_CQの作成時に RIOCreateCompletionQueue 関数に渡されます。
イベントを使用する完了キューの場合、RIO_NOTIFICATION_COMPLETION構造体の Type メンバーは RIO_EVENT_COMPLETION に設定されます。 Event.EventHandle メンバーには、WSACreateEvent 関数または CreateEvent 関数によって作成されたイベントのハンドルが含まれている必要があります。 RIONotify の完了を受け取る場合、アプリケーションは WSAWaitForMultipleEvents または同様の待機ルーチンを使用して、指定されたイベント ハンドルを待機する必要があります。 アプリケーションがイベントのリセットと再利用を計画している場合、 Event.NotifyReset メンバーを 0 以外の値に設定することで、アプリケーションのオーバーヘッドを削減できます。 これにより、通知が発生すると、 RIONotify 関数によってイベントが自動的にリセットされます。 これにより、RIONotify 関数の呼び出し間でイベントをリセットするために WSAResetEvent 関数を呼び出す必要が軽減されます。
RIONotify 関数が used イベント補完と呼ばれ、指定された完了キューがまだ空でない場合、イベントは同期的または非同期的に設定されます。 どちらの場合も、イベントが設定される前に、追加のエントリを入力する必要はありません。 RIO_MSG_DONT_NOTIFY フラグが 設定されていない要求の完了が完了キューに含まれるまで、この完了キューは RIONotify 関数の目的で空と見なされ、イベントは設定されません。 完了した要求は、 RIODequeueCompletion 関数を使用して引き続き取得できます。 イベントが設定されている場合、アプリケーションは通常 、RIODequeueCompletion 関数を呼び出して、完了した送受信要求をデキューします。
I/O 入力候補ポートを使用する完了キューの場合、RIO_NOTIFICATION_COMPLETION構造体の Type メンバーは RIO_IOCP_COMPLETION に設定されます。 Iocp.IocpHandle メンバーには、CreateIoCompletionPort 関数によって作成された I/O 入力候補ポートのハンドルが含まれている必要があります。 RIONotify 完了を受け取るには、アプリケーションで GetQueuedCompletionStatus または GetQueuedCompletionStatusEx 関数を呼び出す必要があります。 アプリケーションは、完了キューに専用の OVERLAPPED オブジェクトを提供する必要があります。また、 Iocp.CompletionKey メンバーを使用して、完了キュー上の RIONotify 要求と、他の完了キューの RIONotify 補完を含む他の I/O 完了を区別することもできます。
スレッド プールを使用するアプリケーションでは、スレッド プール待機オブジェクトを使用して、そのスレッド プールを介して RIONotify 完了を取得できます。 その場合、 SetThreadpoolWait 関数の呼び出しは 、RIONotify の呼び出しの直後に行う必要があります。 RIONotify の前に SetThreadpoolWait 関数が呼び出され、アプリケーションが RIONotify を使用してイベント オブジェクトをクリアすると、待機オブジェクト コールバックが誤って実行される可能性があります。
注意
RIONotify 関数への関数ポインターは、実行時に、指定された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 ストア アプリでサポートされています。
スレッド セーフ
RIODequeueCompletion 関数を使用して複数のスレッドが同じRIO_CQにアクセスしようとすると、クリティカル セクション、スリム リーダー ライター ロック、または同様の相互除外メカニズムによってアクセスを調整する必要があります。 完了キューが共有されていない場合、相互の除外は必要ありません。
要件
要件 | 値 |
---|---|
Header | mswsock.h |