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

RIOCreateRequestQueue 関数は、Winsock 登録済み I/O 拡張機能で使用するために、指定されたソケットと I/O 完了キューを使用して、登録済みの I/O ソケット記述子を作成します。

構文

LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;

RIO_RQ LpfnRiocreaterequestqueue(
  SOCKET Socket,
  ULONG MaxOutstandingReceive,
  ULONG MaxReceiveDataBuffers,
  ULONG MaxOutstandingSend,
  ULONG MaxSendDataBuffers,
  RIO_CQ ReceiveCQ,
  RIO_CQ SendCQ,
  PVOID SocketContext
)
{...}

パラメーター

Socket

ソケットを識別する記述子。

MaxOutstandingReceive

ソケットで許可される未処理の受信の最大数。

このパラメーターは、通常、ほとんどのアプリケーションでは少数です。

MaxReceiveDataBuffers

ソケット上の受信データ バッファーの最大数。

注意

Windows 8 と Windows Server 2012 の場合、このパラメーターは 1 である必要があります。

MaxOutstandingSend

ソケットで許可されている未処理の送信の最大数。

MaxSendDataBuffers

ソケット上の送信データ バッファーの最大数。

注意

Windows 8 と Windows Server 2012 の場合、このパラメーターは 1 である必要があります。

ReceiveCQ

受信要求の完了に使用する I/O 完了キューを識別する記述子。

SendCQ

送信要求の完了に使用する I/O 完了キューを識別する記述子。

このパラメーターには 、ReceiveCQ パラメーターと同じ値を指定できます。

SocketContext

この要求キューに関連付けるソケット コンテキスト。

戻り値

エラーが発生しない場合、 RIOCreateRequestQueue 関数は、新しい要求キューを参照する記述子を返します。 それ以外の場合は、 RIO_INVALID_RQ の値が返され、 WSAGetLastError 関数を呼び出すことで特定のエラー コードを取得できます。

リターン コード 説明
WSAEINVAL
無効なパラメーターが関数に渡されました。
ReceiveCQ パラメーターまたは SendCQ パラメーターにRIO_INVALID_CQが含まれている場合このエラーが返されます。 MaxOutstandingReceive パラメーターと MaxOutstandingSend パラメーターの両方が 0 の場合、このエラーが返されます。 Socket パラメーターで 渡されたソケットが初期化中または終了中の場合も、このエラーが返されます。
WSAENOBUFS
十分なメモリを割り当てませんでした。 このエラーは、パラメーターに基づいて要求キューを割り当てるためのメモリが不足していた場合に返されます。 このエラーは、ネットワーク セッションの制限を超えた場合にも返されます。
WSAENOTSOCK
記述子はソケットではありません。 Socket パラメーターが有効なソケットでない場合、このエラーが返されます。
WSAEOPNOTSUPP
試行された操作は、参照されたオブジェクトの種類に対してサポートされていません。 このエラーは、サポートされていないソケット型 (SOCK_RAWなど) の Socket パラメーターのソケットに対して返されます。

注釈

RIOCreateRequestQueue 関数は、指定されたソケットと I/O 完了キューを使用して、登録済みの I/O ソケット記述子を作成します。 アプリケーションで RIOSendRIOSendExRIOReceive、または RIOReceiveEx 関数を使用するには、アプリケーションで RIOCreateRequestQueue を呼び出して Winsock ソケットのRIO_RQを取得する必要があります。 RIO_RQを取得するには、Winsock ソケットを送受信の完了キューに関連付ける必要がありますが、両方に同じ完了キューを使用できます。

完了キューのサイズが有限であるため、キューに登録された完了の合計容量を超えないことを保証する場合、ソケットは送受信操作の完了キューにのみ関連付けられます。 したがって、ソケット固有の制限は 、RIOCreateRequestQueue 関数の呼び出しによって確立されます。 これらの制限は 、RIOCreateRequestQueue 呼び出し中に、ソケット要求に対応するために完了キュー内の十分な領域を確認する場合と、要求の開始時間中に、要求によってソケットがその制限を超えないようにするために使用されます。

送受信キューは、複数のソケットに関連付けることができます。 送受信キューのサイズは、接続されているすべてのソケットの送受信サイズ以上である必要があります。 closesocket 関数を使用してソケットを閉じて要求キューが閉じられると、それらのスロットは他のソケットで使用するために解放されます。

注意

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

 

アプリケーションがRIO_RQを使用して終了したら、アプリケーションは closesocket 関数を呼び出してソケットを閉じ、関連付けられているリソースを解放する必要があります。

注意

RIOCreateRequestQueue 関数への関数ポインターは、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 ストア アプリでサポートされています。

要件

要件
Header mswsock.h