SIO_LOOPBACK_FAST_PATH控制代码

说明

SIO_LOOPBACK_FAST_PATH控制代码配置 TCP 套接字,以降低环回接口上的延迟和更快的操作速度。

重要SIO_LOOPBACK_FAST_PATH已弃用,不建议在代码中使用。

若要执行此操作,请使用以下参数调用 WSAIoctlWSPIoctl 函数。

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 返回 WSAEINVALlBytesReturned 参数指向 DWORD 值零。

如果 lpOverlappedNULL,则成功调用时返回的 lpcbBytesReturned 参数指向的 DWORD 值不能为零。

如果对于重叠套接字, lpOverlapped 参数不是 NULL ,则将启动无法立即完成的操作,并在以后的时间指示完成。 返回的 lpcbBytesReturned 参数指向的 DWORD 值可能为零,因为在重叠操作完成之前无法确定存储的数据的大小。 当操作完成时发出相应的完成方法信号时,可以检索最终完成状态。

lpvOverlapped

指向 WSAOVERLAPPED 结构的指针。

如果套接字 是在 不使用重叠属性的情况下创建的,则忽略 lpOverlapped 参数。

如果 使用重叠属性打开,并且 lpOverlapped 参数不是 NULL,则该操作将作为重叠 (异步) 操作执行。 在这种情况下, lpOverlapped 参数必须指向有效的 WSAOVERLAPPED 结构。

对于重叠操作, WSAIoctlWSPIoctl 函数将立即返回,并在操作完成时发出相应的完成方法的信号。 否则,函数在操作完成或发生错误之前不会返回。

lpCompletionRoutine

类型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

指向完成操作时调用的完成例程的指针, (忽略非重叠套接字) 。

lpThreadId

指向 WSATHREADID 结构的指针,供提供程序在后续调用 WPUQueueApc 时使用。 在 WPUQueueApc 函数返回之前,提供程序应存储引用的 WSATHREADID 结构 (而不是指向同一) 的指针。

注意 此参数仅适用于 WSPIoctl 函数。

lpErrno

指向错误代码的指针。

注意 此参数仅适用于 WSPIoctl 函数。

返回值

如果操作成功完成, WSAIoctlWSPIoctl 函数将返回零。

如果操作失败或挂起, WSAIoctlWSPIoctl 函数将返回 SOCKET_ERROR。 若要获取扩展错误信息,请调用 WSAGetLastError

错误代码 含义
WSA_IO_PENDING 重叠的 I/O 操作正在进行中。 如果已成功启动重叠操作,并且稍后将指示完成,则返回此值。
WSA_OPERATION_ABORTED 由于发生线程退出或应用程序请求,I/O 操作已中止。 如果由于套接字关闭或执行 SIO_FLUSH IOCTL 命令而取消了重叠操作,则返回此错误。
WSAEACCES 尝试以被其访问权限禁止的方式访问套接字。 在以下几种情况下,将返回此错误:用户在本地计算机上缺少所需的管理权限,或者应用程序没有作为内置管理员 (RunAs administrator) 在增强的 shell 中运行。
WSAEFAULT 系统在尝试在调用中使用指针参数时检测到指针地址无效。 此错误返回的 lpvInBufferlpvoutBufferlpvbytesReturnedlpOverlappedlpCompletionRoutine 参数未完全包含在用户地址空间的有效部分。
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。 因此,connectExWSAConnect、WSAConnectByListWSAConnectByName 函数用于启动连接的套接字必须应用此 IOCTL 才能将快速路径用于环回操作。

侦听连接请求的套接字在接受连接之前必须应用此 IOCTL。 因此,侦听函数使用的套接字必须应用此 IOCTL,以便接受的任何套接字都将使用快速路径进行环回。 侦听函数返回并传递给 acceptAcceptExWSAAccept 函数的任何套接字都将标记为使用特殊的快速路径进行环回操作。

应用程序使用快速路径在环回接口上建立连接后,连接生存期内的所有数据包都必须使用快速路径。

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

另请参阅

IPPROTO_IP套接字选项

IPPROTO_IPV6套接字选项

IPPROTO_TCP套接字选项

socket

SOL_SOCKET套接字选项

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW