Socket.IOControl()
的字节数组参数特定于指定为第一个参数的IOControlCode
。
第一个数组用于输入数据,第二个数组用于输出数据。
要查找有关这些数组的特定布局的更多信息,首先查看枚举,这会列出所有可能的操作。从那里开始,您应该参考列出的可用于C可操作功能的文档,其中包含了Socket.IOControl()
。这些是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方法应该为您包装管理数组大小的细节,因此您遇到的代码段试图为套接字启用RCVALL_ON
。
这里是winehq.org链接到C头文件: mstcpip.h at winehq.org
如果您已经安装了C/C++的Visual Studio支持,您可以找到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;
我找不到那个具体说了任何文件s什么尺寸的字节数组应该用来通过RCVALL_VALUE
,但是如果你看IOControl()
的样本,他们使用BitConverter.GetBytes(0)
作为默认参数,它的大小为4字节(对应于一个.NET int)并且与你的例子相匹配。这足以在C操作中适合RCVALL_VALUE
。
感谢您的详细有用的评论,但“byOut”数组呢? – 2012-02-25 02:19:31
用'byOut'指定的参数槽用于接收从所选IOControl特征返回的数据。对于SIO_RCVALL,不需要特殊的返回数据(请参见SIO_RCVALL链接上的lpvOutBuffer注释)。您可能能够传递一个空数组,甚至可能为null。 – meklarian 2012-02-25 02:24:29