SIO_LOOPBACK_FAST_PATH コントロール コード
説明
SIO_LOOPBACK_FAST_PATH制御コードは、ループバック インターフェイスに対する待機時間を短縮し、操作を高速化するために TCP ソケットを構成します。
大事なSIO_LOOPBACK_FAST_PATHは非推奨であり、コードで使用することはお勧めしません。
この操作を実行するには、次のパラメーターを指定して WSAIoctl または WSPIoctl 関数を呼び出します。
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to 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_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to 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_LOOPBACK_FAST_PATH を使用します。
lpvInBuffer
入力バッファーへのポインター。 このパラメーターには、高速ループバック操作用にソケットを構成する必要があるかどうかを示すブール値へのポインターが含まれています。
cbInBuffer
入力バッファーのサイズ (バイト単位)。
lpvOutBuffer
出力バッファーへのポインター。 このパラメーターは、この操作では使用されません。
cbOutBuffer
出力バッファーのサイズ (バイト単位)。 このパラメーターは 0 に設定する必要があります。
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 | 重複した I/O 操作が進行中です。 この値は、重複した操作が正常に開始され、完了が後で示される場合に返されます。 |
WSA_OPERATION_ABORTED | スレッドの終了またはアプリケーションの要求が原因で、I/O 操作が中止されました。 このエラーは、ソケットのクローズまたは SIO_FLUSH IOCTL コマンドの実行により、重複した操作が取り消された場合に返されます。 |
WSAEACCES | アクセス許可によって禁止されている方法でソケットにアクセスしようとしました。 このエラーは、次のような永続的なポート予約のいくつかの条件下で返されます。ユーザーがローカル コンピューターに必要な管理特権を持っていないか、アプリケーションが組み込みの管理者 (RunAs administrator ) として拡張シェルで実行されていません。 |
WSAEFAULT | 呼び出しでポインター引数を使用しようとしたときに、システムによって無効なポインター アドレスが検出されました。 このエラーは、 lpvInBuffer、 lpvoutBuffer、 lpcbBytesReturned、 lpOverlapped または lpCompletionRoutine パラメーターが、ユーザー アドレス空間の有効な部分に完全には含まれていません。 |
WSAEINPROGRESS | 現在、ブロック操作を実行中です。 コールバックの実行中に関数が呼び出されると、このエラーが返されます。 |
WSAEINTR | WSACancelBlockingCall の呼び出しによってブロック操作が中断されました。 このエラーは、ブロック操作が中断された場合に返されます。 |
WSAEINVAL | 無効な引数が指定されました。 このエラーは、 dwIoControlCode パラメーターが有効なコマンドではない場合、または指定された入力パラメーターが受け入れられない場合、または指定されたソケットの型にコマンドが適用されない場合に返されます。 |
WSAENETDOWN | ソケット操作によりネットワークの停止が検出されました。 このエラーは、ネットワーク サブシステムが失敗した場合に返されます。 |
WSAENOTSOCK | ソケットではない操作が試行されました。 記述子 s がソケットでない場合、このエラーが返されます。 |
WSAEOPNOTSUPP | 試行された操作は、参照されるオブジェクトの種類ではサポートされていません。 このエラーは、指定された IOCTL コマンドがサポートされていない場合に返されます。 このエラーは、 SIO_LOOPBACK_FAST_PATH IOCTL がトランスポート プロバイダーでサポートされていない場合にも返されます。 |
注釈
アプリケーションでは 、SIO_LOOPBACK_FAST_PATH IOCTL を使用して待機時間を短縮し、TCP ソケットでのループバック操作のパフォーマンスを向上させることができます。 この IOCTL は、TCP/IP スタックがこのソケットでのループバック操作に特別な高速パスを使用することを要求します。 SIO_LOOPBACK_FAST_PATH IOCTL は TCP ソケットでのみ使用できます。 この IOCTL は、ループバック セッションの両側で使用する必要があります。 TCP ループバック高速パスは、IPv4 または IPv6 ループバック インターフェイスを使用してサポートされます。
接続要求を開始する予定のソケットは、接続要求を行う前に、この IOCTL を適用する必要があります。 そのため、接続を開始するために connect、ConnectEx、WSAConnect、WSAConnectByList、または WSAConnectByName 関数で使用されるソケットは、ループバック操作に高速パスを使用するためにこの IOCTL を適用する必要があります。
接続要求をリッスンしているソケットは、接続を受け入れる前に、この IOCTL を適用する必要があります。 そのため、リッスン関数で使用されるソケットは、この IOCTL を適用する必要があるため、受け入れられるソケットはループバックに高速パスを使用します。 listen 関数によって返され、 accept、 AcceptEx、または WSAAccept 関数に渡されるすべてのソケットは、ループバック操作に特別な高速パスを使用するようにマークされます。
アプリケーションが高速パスを使用してループバック インターフェイスで接続を確立したら、接続の有効期間中のすべてのパケットで高速パスを使用する必要があります。
非ループバック パスに接続されるソケットに SIO_LOOPBACK_FAST_PATH を適用しても、効果はありません。
この TCP ループバック最適化により、ネットワーク層を経由する従来のループバックではなく、トランスポート層 (TL) を通過するパケットが生成されます。 この最適化により、ループバック パケットの待機時間が短縮されます。 アプリケーションがループバック 高速パスを使用するように接続レベル設定をオプトインすると、すべてのパケットがループバック パスに従います。 ループバック通信の場合、輻輳とパケットドロップは想定されません。 TCP での輻輳制御と信頼性の高い配信の概念は不要です。 ただし、これはフロー制御には当てはまりません。 フロー制御がないと、送信側が受信バッファーを圧倒し、TCP ループバックの誤動作が発生する可能性があります。 TCP 最適化ループバック パスのフロー制御は、送信要求をキューに配置することによって維持されます。 受信バッファーがいっぱいになると、TCP/IP スタックは、キューがフロー制御を維持するサービスが提供されるまで送信が完了しないことを保証します。
接続データの Windows フィルタリング プラットフォーム (WFP) コールアウトが存在する TCP 高速パス ループバック接続は、ループバックの最適化されていない低速パスを使用する必要があります。 そのため、WFP フィルターを使用すると、この新しいループバック 高速パスが使用されなくなります。 WFP フィルターが有効になっている場合、 SIO_LOOPBACK_FAST_PATH IOCTL が設定されている場合でも、システムは低速パスを使用します。 これにより、ユーザー モード アプリケーションに完全な WFP セキュリティ機能が確保されます。
既定では、 SIO_LOOPBACK_FAST_PATH は無効になっています。
SIO_LOOPBACK_FAST_PATH IOCTL を使用してソケットでループバック高速パスを有効にする場合は、TCP/IP ソケット オプションのサブセットのみがサポートされます。 サポートされているオプションの一覧には、次のものが含まれます。
- IP_TTL
- IP_UNICAST_IF
- IPV6_UNICAST_HOPS
- IPV6_UNICAST_IF
- IPV6_V6ONLY
- SO_CONDITIONAL_ACCEPT
- SO_EXCLUSIVEADDRUSE
- SO_PORT_SCALABILITY
- SO_RCVBUF
- SO_REUSEADDR
- TCP_BSDURGENT