LPFN_RIOSEND コールバック関数 (mswsock.h)
RIOSend 関数は、Winsock 登録済み I/O 拡張機能で使用するために、接続された登録済み I/O TCP ソケットまたはバインドされた登録済み I/O UDP ソケットにネットワーク データを送信します。
構文
LPFN_RIOSEND LpfnRiosend;
BOOL LpfnRiosend(
RIO_RQ SocketQueue,
PRIO_BUF pData,
ULONG DataBufferCount,
DWORD Flags,
PVOID RequestContext
)
{...}
パラメーター
SocketQueue
接続された登録済み I/O TCP ソケットまたはバインドされた登録済み I/O UDP ソケットを識別する記述子。
pData
データの送信元となる登録済みバッファーの部分の説明。
アプリケーションが UDP データグラムでデータ ペイロードを送信する必要がない場合、バインドされた登録済み I/O UDP ソケットの場合、このパラメーターは NULL になる可能性があります。
DataBufferCount
pData パラメーターが指すバッファーでデータを送信するかどうかを示すデータ バッファーカウント パラメーター。
pData が NULL の場合、このパラメーターは 0 に設定する必要があります。 それ以外の場合は、このパラメーターを 1 に設定する必要があります。
Flags
RIOSend 関数の動作を変更するフラグのセット。
Flags パラメーターには、ヘッダー ファイルでMswsockdef.h
定義されている次のオプションの組み合わせを含めることができます。
RIO_MSG_COMMIT_ONLY
RIO_MSG_DEFER フラグで追加された以前の要求はコミットされます。
RIO_MSG_COMMIT_ONLY フラグが設定されている場合、他のフラグを指定することはできません。 RIO_MSG_COMMIT_ONLY フラグが設定されている場合、pData 引数と RequestContext 引数は NULL、DataBufferCount 引数は 0 である必要があります。
通常、このフラグは、 RIO_MSG_DEFER フラグが設定された状態で多数の要求が発行された後に使用されます。 これにより、 RIO_MSG_DEFER フラグを使用して、 RIO_MSG_DEFER フラグなしで最後の要求を行う必要がなくなります。これにより、最後の要求が他の要求よりもはるかに遅く完了します。
RIOSend 関数の他の呼び出しとは異なり、RIO_MSG_COMMIT_ONLY フラグが設定されている場合、RIOSend 関数の呼び出しをシリアル化する必要はありません。 1 つのRIO_RQの場合、RIOSend 関数は、別のスレッドで RIOSend 関数を呼び出しながら、1 つのスレッドでRIO_MSG_COMMIT_ONLYを使用して呼び出すことができます。
RIO_MSG_DONT_NOTIFY
要求の完了が完了キューに挿入された場合、要求は RIONotify 関数をトリガーしないでください。
RIO_MSG_DEFER
要求をすぐに実行する必要はありません。 これにより要求が要求キューに挿入されますが、要求の実行がトリガーされる場合とトリガーされない場合があります。
RIO_MSG_DEFER フラグを設定せずに SocketQueue パラメーターで渡RIO_RQで送信要求が行われるまで、データの送信が遅れる可能性があります。 送信キュー内のすべての送信の実行をトリガーするには、RIO_MSG_DEFER フラグを設定せずに RIOSend または RIOSendEx 関数を呼び出します。
注意
送信要求は、RIO_MSG_DEFERが設定されているかどうかに関係なく、SocketQueue パラメーターで渡されたRIO_RQの未処理の I/O 容量に対して課金されます。
RequestContext
戻り値
エラーが発生しない場合、 RIOSend 関数はTRUE を返します。 この場合、送信操作は正常に開始され、完了は既にキューに登録されているか、操作が正常に開始され、完了は後でキューに入れられます。
FALSE の値は、関数が失敗し、操作が正常に開始されず、完了通知がキューに登録されないことを示します。 WSAGetLastError 関数を呼び出すことで、特定のエラー コードを取得できます。
リターン コード | 説明 |
---|---|
WSAEFAULT | 呼び出しでポインター引数を使用しようとしたときに、システムにより、無効なポインター アドレスが検出されました。 このエラーは、操作がキューに登録または呼び出される前にパラメーターで渡された RIO_BUF 構造体のいずれかに対してバッファー ID が登録解除されたか、バッファーが解放された場合に返されます。 |
WSAEINVAL | 無効なパラメーターが関数に渡されました。 SocketQueue パラメーターが無効な場合、Flags パラメーターに送信操作で無効な値が含まれている場合、または完了キューの整合性が損なわれた場合、このエラーが返されます。 このエラーは、パラメーターに関する他の問題でも返すことができます。 |
WSAENOBUFS | 十分なメモリを割り当てませんでした。 SocketQueue パラメーターに関連付けられている I/O 完了キューがいっぱいであるか、送信エントリが 0 の I/O 完了キューが作成された場合、このエラーが返されます。 |
WSA_IO_PENDING | 操作が正常に開始され、完了は後でキューに入れられます。 |
注釈
アプリケーションでは 、RIOSend 関数を使用して、1 つの登録済みバッファー内に完全に含まれる任意のバッファーからネットワーク データを送信できます。 pData パラメーターが指すRIO_BUF構造体の Offset メンバーと Length メンバーによって、バッファーから送信されるネットワーク データが決まります。
送信操作に関連付けられているバッファーは、別の送受信操作と同時に使用することはできません。 バッファーとバッファーの登録は、送信操作の間有効なままである必要があります。 つまり、RIOSend(Ex) 要求が既に保留中の場合は、同じPRIO_BUFを RIOSend(Ex) 要求に渡すべきではありません。 フライト中の RIOSend(Ex) 要求が完了した後にのみ、同じPRIO_BUF (オフセットが同じか、オフセットと長さが異なる) を再利用する必要があります。 さらに、送信データが登録済みバッファー (一部またはバッファー全体) を参照する場合は、送信が完了するまで、登録されたバッファー全体を使用しないでください。 これには、受信操作または別の送信操作に登録されているバッファーの一部の使用が含まれます。
Flags パラメーターを使用すると、関連するソケットに指定されたオプションを超えて RIOSend 関数の動作に影響を与えることができます。 この関数の動作は、 SocketQueue パラメーターに関連付けられているソケットに設定されたソケット オプションと Flags パラメーターで指定された値の組み合わせによって決まります。
注意
RIOSend 関数への関数ポインターは、実行時に、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 ストア アプリでサポートされています。
要件
要件 | 値 |
---|---|
Header | mswsock.h |