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

LPFN_RIONOTIFY

コールバック

シグネチャ

INT LPFN_RIONOTIFY(
    RIO_CQ CQ
);

パラメーター

フィールド型説明
CQRIO_CQI/O 完了キューを識別する記述子です。

公式ドキュメント

RIONotify 関数は、Winsock 登録済み I/O 拡張機能で使用する I/O 完了キューの通知動作に用いるメソッドを登録します。

戻り値

エラーが発生しない場合、RIONotify 関数は ERROR_SUCCESS を返します。それ以外の場合、関数は失敗しており、特定のエラーコードが返されます。

戻り値 説明
WSAEINVAL
無効なパラメーターが関数に渡されました。
このエラーは、CQ パラメーターに無効な完了キュー(RIO_INVALID_CQ など)が渡された場合に返されます。また、内部エラーが発生した場合にも返されることがあります。
WSAEALREADY
既に操作が進行中の非ブロッキングソケットに対して、操作が試行されました。
このエラーは、以前の RIONotify 要求がまだ完了していない場合に返されます。

解説(Remarks)

RIONotify 関数は、Winsock 登録済み I/O 拡張機能によるネットワークデータの送受信に関する通知動作に用いるメソッドを登録します。

RIONotify 関数は、要求が完了し、RIODequeueCompletion 関数の呼び出しを待っていることをアプリケーションが知るための仕組みです。RIONotify 関数は、I/O 完了キューが空ではなく、結果の完了が格納されている場合の通知動作に用いるメソッドを設定します。

完了キューの通知動作は、RIO_CQ の作成時に設定されます。RIO_CQ の作成時には、RIO_NOTIFICATION_COMPLETION 構造体が RIOCreateCompletionQueue 関数に渡されます。

イベントを使用する完了キューでは、RIO_NOTIFICATION_COMPLETION 構造体の Type メンバーに RIO_EVENT_COMPLETION を設定します。Event.EventHandle メンバーには、WSACreateEvent 関数または CreateEvent 関数で作成したイベントのハンドルを格納します。RIONotify の完了を受け取るには、アプリケーションは WSAWaitForMultipleEvents または同様の待機ルーチンを使用して、指定したイベントハンドルを待機する必要があります。イベントをリセットして再利用する予定がある場合、アプリケーションは Event.NotifyReset メンバーに 0 以外の値を設定することでオーバーヘッドを削減できます。これにより、通知が発生した時点で RIONotify 関数がイベントを自動的にリセットします。その結果、RIONotify 関数の呼び出しと呼び出しの間に WSAResetEvent 関数を呼び出してイベントをリセットする必要がなくなります。

イベント完了を使用して RIONotify 関数を呼び出したときに、指定した完了キューが既に空でない場合、イベントは同期的または非同期的に設定されます。いずれの場合も、イベントが設定される前に追加のエントリが完了キューに入る必要はありません。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 の呼び出しの直後に行う必要があります。SetThreadpoolWait 関数を RIONotify より前に呼び出し、かつアプリケーションがイベントオブジェクトのクリアを 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 ストアアプリでサポートされます。

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