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
输出缓冲区的大小(以字节为单位)。 该参数必须设置为零。
lpcbBytesReturned
指向变量的指针,该变量接收存储在输出缓冲区中的数据的大小(以字节为单位)。
如果输出缓冲区太小,则调用失败, WSAGetLastError 返回 WSAEINVAL, lBytesReturned 参数指向 DWORD 值零。
如果 lpOverlapped 为 NULL,则成功调用时返回的 lpcbBytesReturned 参数指向的 DWORD 值不能为零。
如果对于重叠套接字, lpOverlapped 参数不是 NULL ,则将启动无法立即完成的操作,并在以后的时间指示完成。 返回的 lpcbBytesReturned 参数指向的 DWORD 值可能为零,因为在重叠操作完成之前无法确定存储的数据的大小。 当操作完成时发出相应的完成方法信号时,可以检索最终完成状态。
lpvOverlapped
指向 WSAOVERLAPPED 结构的指针。
如果套接字 是在 不使用重叠属性的情况下创建的,则忽略 lpOverlapped 参数。
如果 已 使用重叠属性打开,并且 lpOverlapped 参数不是 NULL,则该操作将作为重叠 (异步) 操作执行。 在这种情况下, lpOverlapped 参数必须指向有效的 WSAOVERLAPPED 结构。
对于重叠操作, WSAIoctl 或 WSPIoctl 函数将立即返回,并在操作完成时发出相应的完成方法的信号。 否则,函数在操作完成或发生错误之前不会返回。
lpCompletionRoutine
类型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
指向完成操作时调用的完成例程的指针, (忽略非重叠套接字) 。
lpThreadId
指向 WSATHREADID 结构的指针,供提供程序在后续调用 WPUQueueApc 时使用。 在 WPUQueueApc 函数返回之前,提供程序应存储引用的 WSATHREADID 结构 (而不是指向同一) 的指针。
注意 此参数仅适用于 WSPIoctl 函数。
lpErrno
指向错误代码的指针。
注意 此参数仅适用于 WSPIoctl 函数。
返回值
如果操作成功完成, WSAIoctl 或 WSPIoctl 函数将返回零。
如果操作失败或挂起, WSAIoctl 或 WSPIoctl 函数将返回 SOCKET_ERROR。 若要获取扩展错误信息,请调用 WSAGetLastError。
错误代码 | 含义 |
---|---|
WSA_IO_PENDING | 重叠的 I/O 操作正在进行中。 如果已成功启动重叠操作,并且稍后将指示完成,则返回此值。 |
WSA_OPERATION_ABORTED | 由于发生线程退出或应用程序请求,I/O 操作已中止。 如果由于套接字关闭或执行 SIO_FLUSH IOCTL 命令而取消了重叠操作,则返回此错误。 |
WSAEACCES | 尝试以被其访问权限禁止的方式访问套接字。 在以下几种情况下,将返回此错误:用户在本地计算机上缺少所需的管理权限,或者应用程序没有作为内置管理员 (RunAs administrator ) 在增强的 shell 中运行。 |
WSAEFAULT | 系统在尝试在调用中使用指针参数时检测到指针地址无效。 此错误返回的 lpvInBuffer、 lpvoutBuffer、 lpvbytesReturned、 lpOverlapped 或 lpCompletionRoutine 参数未完全包含在用户地址空间的有效部分。 |
WSAEINPROGRESS | 阻止操作当前正在执行。 如果在回调正在进行时调用函数,则返回此错误。 |
WSAEINTR | 调用 WSACancelBlockingCall 中断了阻止操作。 如果阻止操作中断,则返回此错误。 |
WSAEINVAL | 提供了无效的参数。 如果 dwIoControlCode 参数不是有效的命令,或者指定的输入参数不可接受,或者命令不适用于指定的套接字类型,则返回此错误。 |
WSAENETDOWN | 套接字操作遇到了一个已死的网络。 如果网络子系统发生故障,则返回此错误。 |
WSAENOTSOCK | 尝试对不是套接字的内容执行操作。 如果描述符 不是 套接字,则返回此错误。 |
WSAEOPNOTSUPP | 引用的对象类型不支持尝试的操作。 如果不支持指定的 IOCTL 命令,则返回此错误。 如果传输提供程序不支持 SIO_LOOPBACK_FAST_PATH IOCTL,也会返回此错误。 |
备注
应用程序可以使用 SIO_LOOPBACK_FAST_PATH IOCTL 来减少延迟并提高 TCP 套接字上的环回操作的性能。 此 IOCTL 请求 TCP/IP 堆栈为此套接字上的环回操作使用特殊的快速路径。 SIO_LOOPBACK_FAST_PATH IOCTL 只能与 TCP 套接字一起使用。 此 IOCTL 必须在环回会话的两端使用。 使用 IPv4 或 IPv6 环回接口支持 TCP 环回快速路径。
计划启动连接请求的套接字在发出连接请求之前必须应用此 IOCTL。 因此,connectEx、WSAConnect、WSAConnectByList 或 WSAConnectByName 函数用于启动连接的套接字必须应用此 IOCTL 才能将快速路径用于环回操作。
侦听连接请求的套接字在接受连接之前必须应用此 IOCTL。 因此,侦听函数使用的套接字必须应用此 IOCTL,以便接受的任何套接字都将使用快速路径进行环回。 侦听函数返回并传递给 accept、 AcceptEx 或 WSAAccept 函数的任何套接字都将标记为使用特殊的快速路径进行环回操作。
应用程序使用快速路径在环回接口上建立连接后,连接生存期内的所有数据包都必须使用快速路径。
将 SIO_LOOPBACK_FAST_PATH 应用到将连接到非环回路径的套接字将不起作用。
此 TCP 环回优化会导致数据包流经传输层 (TL) ,而不是通过网络层的传统环回。 此优化可改善环回数据包的延迟。 一旦应用程序选择加入连接级别设置以使用环回快速路径,所有数据包都将遵循环回路径。 对于环回通信,预期不会发生拥塞和数据包丢弃。 不需要 TCP 中的拥塞控制和可靠交付的概念。 但是,对于流控制,情况并非如此。 如果没有流控制,发送方可能会使接收缓冲区不堪重负,从而导致错误的 TCP 环回行为。 TCP 优化环回路径中的流控制通过在队列中放置发送请求来维护。 当接收缓冲区已满时,TCP/IP 堆栈保证发送不会完成,直到为队列提供服务,以维护流控制。
存在 Windows 筛选平台 (WFP) 标注的连接数据时,TCP 快速路径环回连接必须采用未优化的慢速路径进行环回。 因此,WFP 筛选器将阻止使用此新的环回快速路径。 启用 WFP 筛选器后,即使设置了 IOCTL SIO_LOOPBACK_FAST_PATH ,系统也会使用慢速路径。 这可确保用户模式应用程序具有完整的 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