SIO_RCVALL 控制代码
说明
SIO_RCVALL控制代码使套接字能够接收通过网络接口传递的所有 IPv4 或 IPv6 数据包。
若要执行此操作,请使用以下参数调用 WSAIoctl 或 WSPIoctl 函数。
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 结构。
对于重叠操作, 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 | 已成功启动重叠操作,稍后将指示完成。 |
WSA_OPERATION_ABORTED | 由于套接字关闭或执行 SIO_FLUSH IOCTL 命令,因此取消了重叠操作。 |
WSAEFAULT | lpOverlapped 或 lpCompletionRoutine 参数并不完全包含在用户地址空间的有效部分。 |
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_ANY 或 in6addr_any。
绑定套接字且 IOCTL 成功完成后,对 WSARecv 或 recv 函数的调用将返回通过给定 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 在新接口上启用该行为。