SIO_RCVALL 控制代码

说明

SIO_RCVALL控制代码使套接字能够接收通过网络接口传递的所有 IPv4 或 IPv6 数据包。

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

int WSAIoctl(
  (socket) s,            // descriptor identifying a socket
  SIO_RCV_ALL,                       // dwIoControlCode
  NULL,                              // lpvInBuffer
  0,                                 // cbInBuffer
  NULL,                              // 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
);

参数

S

标识套接字的描述符。

dwIoControlCode

操作的控制代码。 对此操作使用 SIO_RCVALL

lpvInBuffer

指向应包含选项值的输入缓冲区的指针。 SIO_RCVALL IOCTL 选项的可能值在 Mstcpip.h 头文件中定义的 RCVALL_VALUE 枚举中指定。

SIO_RCVALL的可能值如下所示:

含义
RCVALL_OFF 禁用此选项,以便套接字不会接收通过网络接口传递的所有 IPv4 或 IPv6 数据包。
RCVALL_ON 启用此选项,以便套接字接收通过网络接口传递的所有 IPv4 或 IPv6 数据包。 如果 NIC 支持混杂模式,则此选项在 NIC) 卡 (网络接口上启用混杂模式。 在具有网络中心的 LAN 段上,支持混杂模式的 NIC 将捕获 LAN 上的所有 IPv4 或 IPv6 流量,包括同一 LAN 段中其他计算机之间的流量。 所有捕获的数据包 (IPv4 或 IPv6,具体取决于套接字) 将传递到原始套接字。 此选项不会捕获 (ARP、IPX 和 NetBEUI 数据包的其他数据包,例如接口上的) 。 Netmon 对网络接口使用相同的模式,但不使用此选项来捕获流量。
RCVALL_SOCKETLEVELONLY 此功能当前未实现,因此设置此选项没有任何影响。
RCVALL_IPLEVEL 启用此选项,以便 IPv4 或 IPv6 套接字在 IP 级别接收通过网络接口的所有数据包。 此选项不会在网络接口上启用混杂模式卡。 此选项仅影响 IP 级别的数据包处理。 NIC 仍仅接收定向到其配置的单播和多播地址的数据包。 但是,启用此选项的套接字不仅会收到定向到特定 IP 地址的数据包,还会接收 NIC 接收的所有 IPv4 或 IPv6 数据包。 此选项不会捕获 (ARP、IPX 和 NetBEUI 数据包的其他数据包,例如在接口上收到的) 。

cbInBuffer

输入缓冲区的大小(以字节为单位)。 此参数应等于或大于 lpvInBuffer 参数指向的 RCVALL_VALUE 枚举值的大小。

lpvOutBuffer

指向输出缓冲区的指针。 此参数未用于此操作。

cbOutBuffer

输出缓冲区的大小(以字节为单位)。 此参数未用于此操作。

lpcbBytesReturned

指向变量的指针,该变量接收存储在输出缓冲区中的数据的大小(以字节为单位)。 此参数未用于此操作。

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 已成功启动重叠操作,稍后将指示完成。
WSA_OPERATION_ABORTED 由于套接字关闭或执行 SIO_FLUSH IOCTL 命令,因此取消了重叠操作。
WSAEFAULT lpOverlappedlpCompletionRoutine 参数并不完全包含在用户地址空间的有效部分。
WSAEINPROGRESS 回调正在进行时调用 函数。
WSAEINTR 阻止操作中断。
WSAEINVAL dwIoControlCode 参数不是有效的命令,或者指定的输入参数不可接受,或者命令不适用于指定的套接字类型。 如果 cbInBuffer 参数小于 sizeof(UCHAR)lpvInBuffer 参数指向不是 RCVALL_VALUE 枚举值的值,也会返回此错误。 如果找不到与套接字关联的网络接口,也可能会返回此错误。 如果在删除 PCMCIA 或 USB 网络设备(例如) ) (删除或移除了与套接字关联的网络接口,则可能会发生这种情况。
WSAENETDOWN 网络子系统发生故障。
WSAENOBUFS 没有可用的缓冲区空间。
WSAENOPROTOOPT 指定协议不支持套接字选项。
WSAENOTSOCK 描述符 s 不是套接字。
WSAEOPNOTSUPP 不支持指定的 IOCTL 命令。 如果传输提供程序不支持 SIO_RCVALL IOCTL,则返回此错误。

备注

SIO_RCVALL IOCTL 在 Windows 2000 及更高版本的操作系统上受支持。

SIO_RCVALL IOCTL 使套接字能够接收网络接口上的所有 IPv4 或 IPv6 数据包。 传递给 WSAIoctl 或 WSPIoctl 函数的套接字句 必须是下列之一:

  • 创建的 IPv4 套接字,地址系列设置为 AF_INET,套接字类型设置为 SOCK_RAW,协议设置为 IPPROTO_IP。
  • 创建的 IPv6 套接字,地址系列设置为 AF_INET6,套接字类型设置为 SOCK_RAW,协议设置为 IPPROTO_IPV6。

有关原始套接字的详细信息,请参阅 TCP/IP 原始套接字

套接字还必须绑定到显式本地 IPv4 或 IPv6 接口,这意味着不能绑定到 INADDR_ANYin6addr_any

绑定套接字且 IOCTL 成功完成后,对 WSARecvrecv 函数的调用将返回通过给定 IPv4 接口的 IPv4 数据报,或返回通过给定 IPv6 接口传递的 IPv6 数据报。 请注意,必须提供足够大的缓冲区。 设置此 IOCTL 将仅捕获给定接口上的 IPv4 或 IPv6 数据包。 此 IOCTL 不会捕获 (ARP、IPX 和 NetBEUI 数据包的其他数据包,例如接口上的) 。

使用 IOCTL SIO_RCVALL 绑定到特定本地接口的套接字将仅接收通过该接口传递的数据包。 它不会接收在另一个接口上收到的数据包,也不会在另一个接口上转发,而不是使用 SIO_RCVALL IOCTL 绑定的套接字。

在 Windows Server 2008 及更早版本中, SIO_RCVALL IOCTL 设置不会捕获从网络接口发送的本地数据包。 这包括在另一个接口上接收的数据包,并转发了为 SIO_RCVALL IOCTL 指定的网络接口。

在 Windows 7 和 Windows Server 2008 R2 上,已更改此设置,以便捕获从网络接口发送的本地数据包。 这包括在另一个接口上接收的数据包,然后转发到具有 IOCTL SIO_RCVALL 套接字的网络接口。

设置此 IOCTL 需要本地计算机上的管理员权限。

此功能有时称为混杂模式。 不支持在一个接口上应用此选项,然后使用此 IOCTL 进行一次调用的另一个接口的任何直接更改。 应用程序必须首先使用此 IOCTL 关闭第一个接口上的行为,然后使用此 IOCTL 在新接口上启用该行为。

另请参阅

socket

TCP/IP 原始套接字

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW