SIO_IDEAL_SEND_BACKLOG_QUERY コントロール コード
説明
SIO_IDEAL_SEND_BACKLOG_QUERYコントロール コードは、基になる接続の理想的な送信バックログ (ISB) 値を取得します。
この操作を実行するには、次のパラメーターを使用して WSAIoctl または WSPIoctl 関数を呼び出します。
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
(LPVOID) lpvOutBuffer, // output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
int WSPIoctl(
(socket) s, // descriptor identifying a socket
SIO_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
(LPVOID) lpvOutBuffer, // output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
(LPWSATHREADID) lpThreadId, // a WSATHREADID structure
(LPINT) lpErrno // a pointer to the error code.
);
パラメーター
s
ソケットを識別する記述子。
dwIoControlCode
操作の制御コード。 この操作 にはSIO_IDEAL_SEND_BACKLOG_QUERY を使用します。
lpvInBuffer
入力バッファーへのポインター。 このパラメーターは、この操作では使用されません。
cbInBuffer
入力バッファーのサイズ (バイト単位)。 このパラメーターは、この操作では使用されません。
lpvOutBuffer
出力バッファーへのポインター。 lpOverlapped パラメーターと lpCompletionRoutine パラメーターが NULL の場合、このパラメーターは ULONG データ型を指す必要があります。
cbOutBuffer
出力バッファーのサイズ (バイト単位)。 このパラメーターは、少なくとも ULONG データ型のサイズである必要があります。
lpcbBytesReturned
出力バッファーに格納されているデータのサイズをバイト単位で受け取る変数へのポインター。
出力バッファーが小さすぎると、呼び出しは失敗し、 WSAGetLastError はWSAEINVAL を返し、 lpcbBytesReturned パラメーターはDWORD 値 0 を指します。
lpOverlapped が NULL の場合、正常な呼び出しで返される lpcbBytesReturned パラメーターが指す DWORD 値を 0 にすることはできません。
重複するソケットに 対して lpOverlapped パラメーターが NULL でない場合、すぐに完了できない操作が開始され、完了は後で示されます。 返される lpcbBytesReturned パラメーターが指す DWORD 値は、重複する操作が完了するまで格納されているデータのサイズを決定できないため、0 になる場合があります。 最終的な完了状態は、操作が完了したときに適切な完了メソッドが通知されたときに取得できます。
lpvOverlapped
WSAOVERLAPPED 構造体へのポインター。
重複する属性なしでソケット s が作成された場合、 lpOverlapped パラメーターは無視されます。
重複した属性を使用して s を開き、 lpOverlapped パラメーターが NULL でない場合、操作は重複 (非同期) 操作として実行されます。 この場合、 lpOverlapped パラメーターは有効な WSAOVERLAPPED 構造体を指している必要があります。
重複する操作の場合、 WSAIoctl または WSPIoctl 関数は直ちにを返し、操作が完了すると適切な完了メソッドが通知されます。 それ以外の場合、操作が完了するかエラーが発生するまで、関数は を返しません。
lpCompletionRoutine
種類: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
操作が完了したときに呼び出される完了ルーチンへのポインター (重複していないソケットの場合は無視されます)。
lpThreadId
WPUQueueApc への後続の呼び出しでプロバイダーによって使用される WSATHREADID 構造体へのポインター。 プロバイダーは、WPUQueueApc 関数が返されるまで、参照先の WSATHREADID 構造体 (同じへのポインターではない) を格納する必要があります。
メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。
lpErrno
エラー コードへのポインター。
メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。
戻り値
操作が正常に完了すると、 WSAIoctl または WSPIoctl 関数は 0 を返します。
操作が失敗した場合、または保留中の場合、 WSAIoctl または WSPIoctl 関数は SOCKET_ERRORを返します。 拡張エラー情報を取得するには、 WSAGetLastError を呼び出します。
エラー コード | 意味 |
---|---|
WSA_IO_PENDING | 重複した操作が正常に開始され、完了は後で示されます。 |
WSA_OPERATION_ABORTED | ソケットのクローズまたは SIO_FLUSH IOCTL コマンドの実行により、重複した操作が取り消されました。 |
WSAEFAULT | lpvInBuffer、lpvoutBuffer、lpcbBytesReturned、lpOverlapped、lpCompletionRoutine パラメーターは、ユーザー アドレス空間の有効な部分に完全に含まれていません。 |
WSAEINPROGRESS | 関数は、コールバックが進行中のときに呼び出されます。 |
WSAEINTR | ブロック操作が中断されました。 |
WSAEINVAL | dwIoControlCode パラメーターが有効なコマンドではないか、指定された入力パラメーターが受け入れられないか、指定されたソケットの種類にコマンドが適用されません。 cbOutBuffer パラメーターが ULONG データ型のサイズより小さい場合、このエラーが返されます。 |
WSAENETDOWN | ネットワーク サブシステムが失敗しました。 |
WSAENOPROTOOPT | ソケット オプションは、指定されたプロトコルではサポートされていません。 |
WSAENOTCONN | ソケット s が接続されていません。 |
WSAENOTSOCK | 記述子 s はソケットではありません。 |
WSAEOPNOTSUPP | 指定された IOCTL コマンドはサポートされていません。 このエラーは、 SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL がトランスポート プロバイダーでサポートされていない場合に返されます。 このエラーは、 SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL の使用がデータグラム ソケットで行われた場合にも返されます。 |
解説
SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL は、Windows Server 2008、Windows Vista Service Pack 1 (SP1)、およびそれ以降のバージョンのオペレーティング システムでサポートされています。
Windows ソケットを使用して TCP 接続経由でデータを送信する場合は、最高のスループットを実現するために、TCP で十分な量のデータを未処理 (送信済みだが未確認) にしておくことが重要です。 TCP 接続に最適なスループットを実現するために未処理のデータ量の理想的な値は、理想的な送信バックログ (ISB) サイズと呼ばれます。 ISB 値は、TCP 接続と受信側のアドバタイズされた受信ウィンドウ (およびネットワーク内の輻輳の一部) の帯域幅遅延積の関数です。
接続ごとの ISB 値は、Windows Server 2008、Windows Vista と SP1、およびそれ以降のバージョンのオペレーティング システムの TCP プロトコル実装から使用できます。 SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL は、ISB 値が接続に対して動的に変更されたときに通知を取得するためにアプリケーションで使用できます。
Windows Server 2008、Windows Vista SP1 以降のバージョンのオペレーティング システムでは、 接続 状態のストリーム指向ソケットで SIO_IDEAL_SEND_BACKLOG_CHANGEおよびSIO_IDEAL_SEND_BACKLOG_QUERY IOCTL がサポートされます。
TCP 接続の ISB 値の範囲は、理論的には 0 から最大 16 メガバイトまでさまざまです。
SIO_IDEAL_SEND_BACKLOG_CHANGEおよびSIO_IDEAL_SEND_BACKLOG_QUERY IOCTL の一般的な使用方法は、アプリケーションで使用される送信メソッドに基づいています。 2 つの一般的なケースについて説明します。
一度に 1 つのブロックまたは非ブロック送信要求を実行するアプリケーションは、通常、適切なスループットを実現するために Winsock による内部送信バッファリングに依存します。 特定の接続の送信バッファー制限は、 SO_SNDBUF ソケット オプションによって制御されます。 ブロッキング送信メソッドと非ブロッキング送信メソッドの場合、送信バッファーの制限によって、TCP で未処理に保持されるデータの量が決まります。 接続の ISB 値が送信バッファーの制限を超える場合、接続で達成されるスループットは最適ではありません。 スループットを向上させるために、アプリケーションは、ISB の変更通知が接続で発生する ISB クエリの結果に基づいて送信バッファー制限を設定できます。
複数の送信要求が未処理の重複送信メソッドを使用するアプリケーションの場合、TCP で未処理のデータの量は、Winsock の送信バッファー制限と、未処理の重複送信要求に含まれるデータの合計量によって決まります。 この場合、アプリケーションは ISB 値を使用して、保持する必要がある未処理の送信要求の数と、各送信要求のデータ サイズを決定する必要があります。 理想的には、アプリケーションは次の式を満たしたままにすることをお試しください。
ISB value == send buffer limit + (number of simultaneous overlapped send requests * data length per send request)
上記の方法で TCP ソケット経由で ISB IOCTL を使用すると、高帯域幅遅延製品との接続でのスループットの向上と引き換えにメモリ使用量が増加する可能性があることに注意してください。 Windows の TCP 実装では、システム メモリの全体的な使用量に基づいて、必要に応じて ISB 値が調整されます。
SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL は、接続状態のストリーム ソケットでのみ許可されます。 それ以外の場合、 WSAIoctl または WSPIoctl 関数は WSAENOTCONN で失敗します。
サービス プロバイダーの実装によっては、IOCTL が無期限にブロックされる場合があります。 アプリケーションが WSAIoctl または WSPIoctl 関数呼び出しでブロックを許容できない場合は、特にブロックする可能性が高い IOCTL に対して重複した I/O が推奨されます。
SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL はブロックされない可能性があるため、通常は lpOverlapped パラメーターと lpCompletionRoutine パラメーターを NULL に設定して同期的に呼び出されます。
SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL は、次の場合に WSAEINTR またはWSA_OPERATION_ABORTEDで失敗する可能性があります。
TCP 接続は、送信方向に正常に切断されます。 これは、SD_SENDにパラメーターを設定する方法、DisconnectEx 関数の呼び出し、dwFlags パラメーターを TF_DISCONNECTまたはTF_REUSE に設定した TransmitFile 関数または TransmitPackets 関数の呼び出しを使用したシャットダウン関数の呼び出しの結果として発生する可能性があります。 TCP 接続がリセットまたは中止されました。 要求は I/O マネージャーによって取り消されます。
これらの IOCTL の 2 つのインライン ラッパー関数は、 Ws2tcpip.h ヘッダー ファイルで定義されています。 これらのインライン関数は、 SIO_IDEAL_SEND_BACKLOG_CHANGE と SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL を直接使用する代わりに使用することをお勧めします。
SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL のインライン ラッパー関数は、idealsendbacklognotify 関数です。
SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL のインライン ラッパー関数は、idealsendbacklogquery 関数です。
Windows 7 および Windows Server 2008 R2 で TCP の動的送信バッファリングが追加されました。 既定では、アプリケーションがストリーム ソケットで SO_SNDBUF ソケット オプションを設定しない限り、TCP の動的送信バッファリングが有効になります。
netsh を使用して、TCP の動的送信バッファリングを照会または設定することをお勧めします。
TCP の動的送信バッファリングの現在の値は、次のコマンドを使用して取得できます。
netsh winsock show autotuning
TCP の動的送信バッファリングは、次のコマンドを使用して無効にすることができます。
netsh winsock set autotuning off
TCP の動的送信バッファリングは、次のコマンドを使用して有効にすることができます。
netsh winsock set autotuning on
推奨されませんが、次のレジストリ値を 0 に設定することで、アプリケーションから動的送信バッファリングを無効にすることができます。
HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\AFD\Parameters\DynamicSendBufferDisable
NetSh.exeを使用して動的送信バッファリングの値を変更する場合、またはレジストリ値を変更する場合は、変更を有効にするためにコンピューターを再起動する必要があります。
Windows 7 および Windows Server 2008 R2 での動的送信バッファリングでは、 SIO_IDEAL_SEND_BACKLOG_CHANGE および SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL の使用は特別な状況でのみ必要です。