LPFN_RIOSENDEX コールバック関数 (mswsock.h)
RIOSendEx 関数は、接続された登録済み I/O TCP ソケットまたはバインドされた登録済み I/O UDP ソケットにネットワーク データを送信し、Winsock 登録済み I/O 拡張機能で使用するための追加オプションを指定します。
構文
LPFN_RIOSENDEX LpfnRiosendex;
BOOL LpfnRiosendex(
RIO_RQ SocketQueue,
PRIO_BUF pData,
ULONG DataBufferCount,
PRIO_BUF pLocalAddress,
PRIO_BUF pRemoteAddress,
PRIO_BUF pControlContext,
PRIO_BUF pFlags,
DWORD Flags,
PVOID RequestContext
)
{...}
パラメーター
SocketQueue
接続された登録済み I/O TCP ソケットまたはバインドされた登録済み I/O UDP ソケットを識別する記述子。
pData
データの送信元となる登録済みバッファーからのバッファー セグメント。 このパラメーターが指す RIO_BUF 構造体は、登録済みバッファーまたは完全な登録済みバッファーの一部を表すことができます。
アプリケーションが UDP データグラムでデータ ペイロードを送信する必要がない場合、バインドされた登録済み I/O UDP ソケットの場合、このパラメーターは NULL になる可能性があります。
DataBufferCount
pData パラメーターが指すバッファーでデータを送信するかどうかを示すデータ バッファーカウント パラメーター。
pData が NULL の場合、このパラメーターは 0 に設定する必要があります。 それ以外の場合は、このパラメーターを 1 に設定する必要があります。
pLocalAddress
このパラメーターは予約されており、 NULL である必要があります。
pRemoteAddress
入力時にネットワーク・データの送信先となるリモート・アドレスを保持する登録済みバッファーからのバッファー・セグメント。
ソケットが接続されている場合、このパラメーターは NULL になる 可能性があります。
pControlContext
完了時に送信操作に関する追加の制御情報を保持するバッファー スライス。
アプリケーションが追加の制御情報を受け取らない場合、このパラメーターは NULL になる可能性があります。
pFlags
完了時に送信操作のフラグのセットに関する追加情報を保持するバッファー スライス。
アプリケーションが追加のフラグ情報を受け取りたくない場合、このパラメーターは NULL になる 可能性があります。
Flags
RIOSendEx 関数の動作を変更するフラグのセット。
Flags パラメーターには、ヘッダー ファイルでMswsockdef.h
定義されている次のオプションの組み合わせを含めることができます。
RIO_MSG_COMMIT_ONLY
RIO_MSG_DEFER フラグで追加された以前の要求はコミットされます。
RIO_MSG_COMMIT_ONLY フラグが設定されている場合、他のフラグを指定することはできません。 RIO_MSG_COMMIT_ONLY フラグが設定されている場合、pData、pLocalAddress、pRemoteAddress、pControlContext、pFlags、および RequestContext 引数は NULL、DataBufferCount 引数は 0 である必要があります。
通常、このフラグは、 RIO_MSG_DEFER フラグが設定された状態で多数の要求が発行された後に使用されます。 これにより、 RIO_MSG_DEFER フラグを使用して、 RIO_MSG_DEFER フラグなしで最後の要求を行う必要がなくなります。これにより、最後の要求が他の要求よりもはるかに遅く完了します。
RIOSendEx 関数の他の呼び出しとは異なり、RIO_MSG_COMMIT_ONLY フラグが設定されている場合、RIOSendEx 関数の呼び出しをシリアル化する必要はありません。 1 つのRIO_RQの場合、RIOSendEx 関数は、別のスレッドで RIOSendEx 関数を呼び出している間に、あるスレッドで 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
この送信操作に関連付ける要求コンテキスト。
戻り値
エラーが発生しない場合、 RIOSendEx 関数は TRUE を返します。 この場合、送信操作は正常に開始され、完了は既にキューに登録されているか、操作が正常に開始され、完了は後でキューに入れられます。
FALSE の値は、関数が失敗し、操作が正常に開始されず、完了通知がキューに登録されないことを示します。 WSAGetLastError 関数を呼び出すことで、特定のエラー コードを取得できます。
リターン コード | 説明 |
---|---|
WSAEFAULT | 呼び出しでポインター引数を使用しようとしたときに、システムにより、無効なポインター アドレスが検出されました。 このエラーは、操作がキューに登録または呼び出される前にパラメーターで渡された RIO_BUF 構造体のいずれかに対してバッファー ID が登録解除されたか、バッファーが解放された場合に返されます。 |
WSAEINVAL | 無効なパラメーターが関数に渡されました。 SocketQueue パラメーターが無効な場合、Flags パラメーターに送信操作で無効な値が含まれている場合、または完了キューの整合性が損なわれた場合、このエラーが返されます。 このエラーは、パラメーターに関する他の問題でも返すことができます。 |
WSAENOBUFS | 十分なメモリを割り当てませんでした。 SocketQueue パラメーターに関連付けられている I/O 完了キューがいっぱいであるか、送信エントリが 0 の I/O 完了キューが作成された場合、このエラーが返されます。 |
WSA_IO_PENDING | 操作が正常に開始され、完了は後でキューに入れられます。 |
注釈
アプリケーションでは 、RIOSendEx 関数を使用して、登録されている 1 つのバッファー内に完全に含まれる任意のバッファーからネットワーク データを送信できます。 pData パラメーターが指すRIO_BUF構造体の Offset メンバーと Length メンバーによって、バッファーから送信されるネットワーク データが決まります。
送信操作に関連付けられているバッファーは、別の送受信操作と同時に使用することはできません。 バッファーとバッファーの登録は、送信操作の間有効なままである必要があります。 つまり、RIOSend(Ex) 要求が既に保留中の場合は、同じPRIO_BUFを RIOSend(Ex) 要求に渡すべきではありません。 フライト中の RIOSend(Ex) 要求が完了した後にのみ、同じPRIO_BUF (オフセットが同じか、オフセットと長さが異なる) を再利用する必要があります。 さらに、送信データが登録済みバッファー (一部またはバッファー全体) を参照する場合は、送信が完了するまで、登録されたバッファー全体を使用しないでください。 これには、受信操作または別の送信操作に登録されているバッファーの一部の使用が含まれます。
pLocalAddress パラメーターを使用して、データの送信元のローカル アドレスを取得できます。 pRemoteAddress パラメーターを使用して、データの送信先のリモート アドレスを取得できます。 ローカル アドレスとリモート アドレスは、 SOCKADDR_INET 構造体として返されます。 その結果、pLocalAddress パラメーターまたは pRemoteAddress パラメーターが指すRIO_BUFの Length メンバーは、SOCKADDR_INET構造体のサイズ以上である必要があります。
次の表は、 pControlContext メンバーのコントロール情報で使用できるコントロール データのさまざまな使用方法をまとめたものです。
Protocol | cmsg_level | cmsg_type | 説明 |
---|---|---|---|
IPv4 | IPPROTO_IP | IP_PKTINFO | パケット情報を指定/受信します。 詳細については、「 IP_PKTINFO ソケット オプションのIPPROTO_IP ソケット オプション」を 参照してください。 |
IPv6 | IPPROTO_IPV6 | IPV6_DSTOPTS | 宛先オプションを指定/受信します。 |
IPv6 | IPPROTO_IPV6 | IPV6_HOPLIMIT | ホップ制限を指定/受信します。 詳細については、「 IPV6_HOPLIMIT ソケット オプションのIPPROTO_IPV6 ソケット オプション」を 参照してください。 |
IPv6 | IPPROTO_IPV6 | IPV6_HOPOPTS | ホップバイホップ オプションを指定/受信します。 |
IPv6 | IPPROTO_IPV6 | IPV6_NEXTHOP | 次ホップ アドレスを指定します。 |
IPv6 | IPPROTO_IPV6 | IPV6_PKTINFO | パケット情報を指定/受信します。 詳細については、 IPV6_PKTINFO ソケット オプションのIPPROTO_IPV6 ソケット オプションに関するページを参照してください。 |
IPv6 | IPPROTO_IPV6 | IPV6_RTHDR | ルーティング ヘッダーを指定/受信します。 |
制御データは、1 つ以上の制御データ・オブジェクトで構成され、それぞれ WSACMSGHDR 構造体で始まり、以下のように定義されます。
} WSACMSGHDR;
WSACMSGHDR 構造体のメンバーは次のとおりです。
期間 | 説明 |
---|---|
cmsg_len | WSACMSGHDR の先頭からデータの末尾までのデータのバイト数 (データに従う可能性がある埋め込みバイトを除く)。 |
cmsg_level | 制御情報を生成したプロトコル。 |
cmsg_type | プロトコル固有の制御情報の種類。 |
Flags パラメーターを使用すると、関連するソケットに指定されたオプションを超えて RIOSendEx 関数の動作に影響を与えることができます。 この関数の動作は、 SocketQueue パラメーターに関連付けられているソケットに設定されたソケット オプションと Flags パラメーターで指定された値の組み合わせによって決まります。
注意
RIOSendEx 関数への関数ポインターは、実行時に、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 |