Socket.IOControl() 的字节数组参数特定于指定为第一个参数的 IOControlCode。
第一个数组用于输入数据,第二个数组用于输出数据。
要查找有关这些数组的特定布局的更多信息,从查看枚举开始会很有帮助,它为您列出了所有可能的操作。从那里,您应该交叉引用为 Socket.IOControl() 包装的 C 可操作函数列出的文档。它们是WSAIoctl() 和ioctlsocket()。
IOControlCode Enumeration @ MSDN
WSAIoctl() function @ MSDN
ioctlsocket() function @ MSDN
根据IOControlCode.ReceiveAll 的文档:
启用接收网络上的所有 IPv4 数据包。插座必须有
地址族 InterNetwork,套接字类型必须是 Raw,并且
协议类型必须是 IP。当前用户必须属于
本地计算机上的管理员组,并且套接字必须是
绑定到特定端口。 Windows 支持此控制代码
2000 及更高版本的操作系统。这个值等于 Winsock 2
SIO_RCVALL 常量。
交叉引用SIO_RCVALL,我们发现它在winsock文档中有一个条目。
SIO_RCVALL control code @ MSDN
通读这个条目,它提到输入缓冲区需要选择一种操作模式,最小大小对应于RCVALL_VALUE。在您的语句中,您在输入参数数组中传递值1。我们可以检查头文件,看看这应该是什么意思。
您应该仔细检查手头的 C 头文件,但 wine(Windows 模拟器)的接口兼容副本显示模式 RCVALL_ON 的值是 1。 .NET 方法应该为您包装管理数组大小的详细信息,因此您遇到的代码 sn-p 正在尝试为套接字启用 RCVALL_ON。
这里是 winehq.org 上 C 头文件的链接:
mstcpip.h at winehq.org
如果您已经为 Visual Studio 安装了 C/C++ 支持,您可能能够在类似于以下路径的本地找到 mstcpip.h 和 winsock2.h:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\
我的副本说:
//
// Values for use with SIO_RCVALL* options
//
typedef enum {
RCVALL_OFF = 0,
RCVALL_ON = 1,
RCVALL_SOCKETLEVELONLY = 2,
RCVALL_IPLEVEL = 3,
} RCVALL_VALUE, *PRCVALL_VALUE;
我找不到任何文档明确说明应该使用什么大小的字节数组来传递RCVALL_VALUE,但是如果您查看IOControl() 的示例,他们使用BitConverter.GetBytes(0) 作为默认参数大小为 4 个字节(对应于 .NET int)并与您的示例匹配。这足够大,也可以在 C 操作中容纳 RCVALL_VALUE。